目录
通常情况下,数组名是首元素地址
创建一个数组,分别打印 数组名地址 和 数组首元素地址 即可验证
注意:数组名就是地址,所以以地址的形式打印的时候直接打印
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5 };
//打印数组名的地址
printf(" arr = %p\n", arr);
//打印数组首元素的地址
printf("&arr[0] = %p\n", &arr[0]);
return 0;
}
代码验证
但是有两个例外
-
sizeof(数组名),数组名单独放在sizeof内部
sizeof关键字 - 计算数据所占内存空间大小,单位是字节(byte)
当数组名单独放在sizeof内部时,计算的时整个数组所占内存空间的大小
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5 };
//计算数组单个元素的大小
printf("sizoef(arr[0]) = %d\n", sizeof(arr[0]));
//计算整个数组的大小
printf(" sizeof(arr) = %d\n", sizeof(arr));
//整个数组的大小除以单个元素的大小,就是数组元素个数
printf(" 数组元素个数 = %d\n", sizeof(arr) / sizeof(arr[0]));
return 0;
}
代码验证
-
&数组名,取地址数组名
&数组名,这里的数组名也表示整个数组,取出的是整个数组的地址
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5 };
//打印数组首元素的地址
printf("&arr[0] = %p\n", &arr[0]);
//打印数组名的地址
printf(" arr = %p\n", arr);
//打印&数组名的地址
printf(" &arr = %p\n", &arr);
return 0;
}
代码验证
打印时发现数组首元素地址、数组名地址、&数组名地址都是相同的
因为不论是数组首元素地址还是数组名地址还是&数组名的地址都是从数组的起始位置开始的
当他们各自自增1后就会有不同的变化,自增的是自身相同大小的1
- 由以上代码验证可得
- 数组首元素地址自增1:向后跳过了4个字节,因为每个元素都是int整型(4个字节),则就指向了第二个元素的首地址
- 数组名自增1:通常情况数组名也是数组首元素地址,且不是以上两种特殊情况,所以也是向后跳过4个字节
- &数组名自增1:取地址数组名,取出的是整个数组的地址,所以自增1后跳过的是整个数组的大小,指向的是数组最后一个元素的首地址再加4个字节的地址处