1. 数组名的意义:
- sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
- 除此之外所有的数组名都表示首元素的地址。(一维数组和二维数组的数组名的值都是首元素的地址,但是意义不同,一维数组名+1,跳过第一个元素;二维数组名+1,跳过第一行元素。)
2. 一维数组练习总(sizeof)
&a 和a的区别
a指的是数组首元素的地址+1会跳过第一个元素,到下一个元素,
&a指的是整个数组,值也是数组首元素地址,但是+1会跳过整个数组,
#include<stdio.h>
int main()
{
//一维数组
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a)); // 这个a单独放在sizeof中表示整个数组的大小, int型 一个数据4字节,四个数据16个字节
printf("%d\n", sizeof(a + 0)); //这个a没有单独放入,表示首元素的地址,首元素+0还是首元素,首元素的大小 4字节/32位机器 8字节/64位机器
printf("%d\n", sizeof(*a));//a表示首元素地址,解引用还是首元素,大小 4字节
printf("%d\n", sizeof(a + 1));//a表示首元素地址,+1表示第二个元素,大小4字节/32位机器 8字节/64位机器
printf("%d\n", sizeof(a[1])); //a[1]表示第二个元素,大小4字节
printf("%d\n", sizeof(&a));//&a表示整个数组的地址,整个数组地址也是地址,4字节/32位机器 8字节/64位机器
printf("%d\n", sizeof(*&a)); //&a是数组的地址,*&a就是拿到了数组,*&a--> a,a就是数组名,sizeof(*&a)<-等价->sizeof(a) 可以理解*&这俩抵消了sizeof(a)->表示整个数组,大小16字节
printf("%d\n", sizeof(&a + 1));//&a表示整个数组,+1是跳过整个数组,这个指针类型是我们的int(*a)[4],是一个数组指针,是指针的话,就是4字节/32位机器 8字节/64位机器
printf("%d\n", sizeof(&a[0]));//对第一个元素取地址,地址的话就是4字节/32位机器 8字节/64位机器
printf("%d\n", sizeof(&a[0] + 1));//第一个元素取地址再加1 就是第二个元素地址 ,地址的话就是 4字节/32位机器 8字节/64位机器
return 0;
}
3 分析1
printf("%d\n", sizeof(a)); // 这个a单独放在sizeof中表示整个数组的大小, int型 一个数据4字节,四个数据16个字节
printf("%d\n", sizeof(a + 0)); //这个a没有单独放入,表示首元素的地址,首元素+0还是首元素,首元素的大小 4字节/32位机器 8字节/64位机器
printf("%d\n", sizeof(*a));//a表示首元素地址,解引用还是首元素,大小 4字节
printf("%d\n", sizeof(a + 1));//a表示首元素地址,+1表示第二个元素,大小4字节/32位机器 8字节/64位机器
printf("%d\n", sizeof(a[1])); //a[1]表示第二个元素,大小4字节
4. 分析2
printf("%d\n", sizeof(&a));//&a表示整个数组的地址,整个数组地址也是地址,4字节/32位机器 8字节/64位机器
printf("%d\n", sizeof(*&a)); //&a是数组的地址,*&a就是拿到了数组,*&a--> a,a就是数组名,sizeof(*&a)<-等价->sizeof(a) 可以理解*&这俩抵消了sizeof(a)->表示整个数组,大小16字节
printf("%d\n", sizeof(&a + 1));//&a表示整个数组,+1是跳过整个数组,这个指针类型是我们的int(*a)[4],是一个数组指针,是指针的话,就是4字节/32位机器 8字节/64位机器
5. 分析3
printf("%d\n", sizeof(&a[0]));//对第一个元素取地址,地址的话就是4字节/32位机器 8字节/64位机器
printf("%d\n", sizeof(&a[0] + 1));//第一个元素取地址再加1 就是第二个元素地址 ,地址的话就是 4字节/32位机器 8字节/64位机器