数组名是首元素的地址,但是有两个例外
1.sizeof(首组名) - 数组名表示整个数组
2.&数组名 - 数组名表示整个数组
除了这两个之外,其他都是表示首元素的地址
一维数组
整型数组
```c
int main()
{
int a[] = {
1, 2, 3, 4 };
printf("%d\n",sizeof(a));//16
//sizeof(数组名) -计算的是数组总大小,单位是字节 4*4 = 16
printf("%d\n",sizeof(a+0));//4
//这里是a+0,但不是数组名,是首元素地址,是地址大小就是4/8个字节
printf("%d\n",sizeof(*a)); //4
// 数组名表示首元素地址 *a就是首元素,sizeof(*a)就是4
printf("%d\n",sizeof(a+1)); //4
//a还是首元素地址+1跳过一个元素,就是第二个元素的地址,所以还是4/8 在32是4 在64就是8
printf("%d\n",sizeof(a[1])); //4
//计算第二个元素的大小
printf("%d\n",sizeof(&a));//4
//&a 取出的是数组的地址,但是数组的地址也是地址,地址的大小就是4个或者8个字节
printf("%d\n",sizeof(*&a));//16
// &a 是数组的地址,数组的地址解引用访问的是数组,sizeof计算的是数组的大小,单位是字节
printf("%d\n",sizeof(&a+1));//4/8
//&a是数组的地址,&a+1虽然地址跳过整个数组,但还是地址,所以是4/8个字节
printf("%d\n",sizeof(&a[0]));//4/8
//&a[0] 取出的是第一个元素的地址
printf("%d\n",sizeof(&a[0]+1));//4/8
//&a[0]+1 第二个元素的地址,还是地址 结果是:4/8
return 0;
}
字符数组
char arr[] = { ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’ };
int main()
{
char arr[] = {
'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", sizeof(arr));//6
//sizeof计算的是数组大小 6个元素 每个元素是char 单位是字节
printf("%d\n", sizeof(arr + 0));//4
//这里arr也是首元素地址,所以还是4
printf("%d\n", sizeof(*arr));//1
//arr是首元素地址,解引用就是首元素 ,首元素大小1个字节
printf("%d\n", sizeof(arr[1]));//1
//这里算的是第二个字符的大小也是1
printf("%d\n", sizeof(&arr));//4
//这里取整个数组的地址,但还是地址,所以大小是4/8
printf("%d\n", sizeof(&arr + 1));//4
//这里整个数组的地址&arr+1,就是跳过整个数组,但还是地址地址大小是4/8个字节
printf("%d\n", sizeof(&arr[0] + 1));//4
//取出第一个元素的地址+1 那么就是第二个元素的地址
//strlen是求字符串的长度,也就是在找\0 strlen要的是地址,不要传其他的
//arr没有被sizeof(arr) &arr 之外就是首元素的地址
printf("%d\n", strlen(arr));//随机值
//这里的arr表示的是首元素的地址 strlen找不到\0所以就是随机值
printf("%d\n", strlen(arr + 0));//随机值
//这里的arr表示的是首元素的地址 strlen找不到\0所以就是随机值
printf("%d\n", strlen(*arr));//非法访问 err
//这里是字符'a' 字符a的Ascall值是97相当于把97传进去
printf("%d\n", strlen(arr[1]));//非法访问 err
//这里是字符'b' 字符b的Ascall值是98相当于把98传进去
printf("%d\n",