数组名含义
- 数组名有两个含义:
- 第一含义是:整个数组
- 第二含义是:首元素的地址
- 当出现以下情形时,那么数组名就代表整个数组:
- 在数组定义中
- 在 sizeof 运算表达式中 ,因此sizeof 计算的就是整个数组的大小。sizeof(arr)
- sizeof(arr)为数组元素类型大小和数组元素个数的乘积
- 在取址符&中 , 因此取得的地址是整个数组的地址。
- 其他任何情形下,那么数组名就代表首元素的地址。即:此时数组名就是一个指向首元素的指针。
- 示例:
int a[3]; // 此处,a 代表整个数组
printf("%d\n", sizeof(a)); // 此处,a 代表整个数组
printf("%p\n", &a); // 此处,a 代表整个数组,此处为整个数组的地址
int *p = a; // 此处,a 代表首元素 a[0] 的地址,等价于 &a[0]
p = a + 1; // 此处,a 代表首元素 a[0] 的地址,等价于 &a[0]
function(a); // 此处,a 代表首元素 a[0] 的地址,等价于 &a[0]
scanf("%d", a ); // 此处,a 代表首元素 a[0] 的地址,等价于 &a[0]
C语言只有在第一含义的场合下表现为数组,其他大部分场合都表现为首元素的地址,当数组表现为首元素地址时,实际上就是一个指向其首元素的指针。数组运算实际上就是指针运算。
#include <stdio.h>
int main()
{
int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
printf("%d\n", sizeof(arr)); // 数组的整个大小 10 * 4 = 40
printf("%d\n", sizeof(&arr[0])); // 数组首元素的地址,一般看pc的位数,32位的为4,64位的为8
printf("%d\n", sizeof(&arr)); // &arr表示数组的地址,一般看pc的位数,32位的为4,64位的为8
printf("arr = %p\n", arr); // 表示数组的首元素地址
printf("&arr[0] = %p\n", &arr[0]); // 表