数组和指针的区别

情到浓时终转凉″ 提交于 2020-02-27 03:42:56

数组和指针的区别

1.数组和数组第一个元素

#include<stdio.h>
void main() {
	int arr[] = { 5,8,6,9,3,4,1,7,2,0 };
	//arr = { 2,5,1 };数组名是常量,不可被赋值,这么操作报错
	int* p = arr;
	printf("数组的地址:%p\n", arr);
	printf("数组第一个元素的地址:%p\n", &arr[0]);
	printf("p的值:%p\n", p);
}

返回的结果
数组的地址:000000457811FA88
数组第一个元素的地址:000000457811FA88
p的值:000000457811FA88

上述表明数组其实就是数组第一个元素的位置,arr就是一个地址,所以arr复制给p没问题

2.数组的遍历

void main() {
	int arr[] = { 5,8,6,9,3,4,1,7,2,0 };
	int* p = arr;
	printf("int类型指针大小%d\n", sizeof(int*));//输出8
	printf("p指针大小%d\n", sizeof(p));//输出8
	printf("第一个元素指针大小%d\n", sizeof(&arr[0]));//输出8
	printf("数组大小%d\n", sizeof(arr));//输出40
    //int类型的指针在x64机器里面占用8个字节,int本身占四个字节。
	for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++){
		printf("数组下标=%d,值=%d\n", i, arr[i]);

	}
	//使用p代替arr,完全没问题
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
		printf("数组下标=%d,值=%d\n", i, p[i]);

	}

}

//上面i对打可以为9,当手工输出p[10]的时候也会发生下标越界

3.p的运算

void main() {
	int arr[] = { 5,8,6,9,3,4,1,7,2,0 };
	int* p = arr;

	printf("p的值:::::::::%p\n", p);
	printf("第一个元素位置%p\n", &arr[0]);
	printf("对p取值%d\n", *p);
	p++;

	printf("p的值:::::::::%p\n", p);
	printf("第二个元素位置%p\n", &arr[1]);
	printf("对p取值%d\n", *p);

}

在这里插入图片描述

结果分析:指针加数字得到的还是指针,并且加1,向后移动了四个字节(int类型),直接对该地址取值也能说明情况

4.数组排序

//1.简单的冒泡排序
void main() {
	int arr[] = { 5,8,6,9,3,4,1,7,2,0 };
	int* p = arr;
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
		printf("数组下标=%d,值=%d\n", i, arr[i]);

	}
	//sort(arr);
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]) - 1; i++) {

		for (int j = 0; j < sizeof(arr) / sizeof(arr[0]) - i - 1; j++)
		{
			if (arr[j] > arr[j + 1]) {
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}

	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
		printf("数组下标=%d,值=%d\n", i, p[i]);

	}

}
//结果成功
void sort(int arr[]) {
	for (int i = 0; i < sizeof(arr)/sizeof(arr[0])-1; i++){

		for (int j = 0; j < sizeof(arr) / sizeof(arr[0])-i-1; j++)
		{
			if (arr[j] > arr[j + 1]) {
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}

}

void main() {
	int arr[] = { 5,8,6,9,3,4,1,7,2,0 };
	int* p = arr;
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
		printf("数组下标=%d,值=%d\n", i, arr[i]);

	}
	sort(arr);
	

	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
		printf("数组下标=%d,值=%d\n", i, p[i]);

	}
    //排序失败,debug调试一下

}

在这里插入图片描述

如图,在上面显示arr[0]还是5,还是sizeof(arr)确实8,对arr取值 *arr却等于5,sort方法接受的其实是一个指针,

因此冒泡排序失败

总结:

1.数组就是一堆连续的数,数组名就是数组中第一个元素的地址,数组名一旦确定就不能改变,数组的使用方式指针也能使用,基本遍历赋值都可以

2.指针是什么:指针是一个变量,里面值有特殊意义,代表的是内存地址

3.指针的加减数字其实是对地址进行偏移,偏移的大小和数据类型有关系,指针之间减法得到的就是偏移量

3.数组作为参数接收时,其接收的是指针这时候数组的长度信息就会丢失

记录于此!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!