指针与数组名
6
2021-11-04
区别一:
数组名取地址得到的是数组名所指元素的地址。 对指针取地址得到的是指针变量自身的地址。区别二:
数组是固定大小的,数组一经定义,那么数组名就是一个指向数组首元素类型的常量指针,也就是说数组名是不允许更改的,而指针可以更改。 数组名是常量指针,指针是变量指针。区别三:
当对数组名使用sizeof时,得到的是数组元素的个数乘元素类型的字节数,对指针sizeof得到的是指针类型的字节数。代码
#includeint main() { int arr[3] = {1, 2, 3}; int *p = arr; printf("数组长度为:%d\n", sizeof(arr)); //结果:12 三个元素X四个字节 printf("数组长度为:%d\n", sizeof(p)); //结果:8 操作系统用8个字节表示一个地址 printf("整型长度为:%d\n", sizeof(int)); //结果:4 int型的四字节 printf("指针长度为:%d\n", sizeof(int *)); //结果:8 任一指针 8字节代表一个地址 printf("指针长度为:%d\n", sizeof(char *)); //结果:8 任一指针 8字节代表一个地址 // printf("%d ",*p); //写法3 // printf("%d",p[0]); //写法2 // printf("%d ",*arr); //写法3 for (int i = 0; i < 3; i++) { // printf("%d ",*(p+i)); //写法1 // printf("%d ",*(arr+i)); //写法2 // printf("%d ",*p++); //写法3 // printf("%d",*arr++); //编译出错:p为存放地址的指针变量,arr是常量,地址不变。 } return 0; }
总结
1.数组名代表了一个指向数组首元素的常量指针,一经定义,不可更改,数组名作为常量指针,其类型与数组元素类型相同。指针是变量指针,定义之后仍可更改,其类型在定义时确定。 2.当出现sizeof,和&操作符时,数组名不再当成指向一个元素的常量指针来使用,而指针仍当成指向一个元素的变量指针来使用。指针和数组下标的选择
系统在使用数组下标对数组成员变量进行访问时,开销比较大,指针的访问效率是远远大于数组名的访问效率的。但是只有在指针正确访问时,才成比下标法更有效率。下标法更加容易理解,在可读性方面,也更加的具有优势。- 0
-
分享