一维数组
int a[] = {1,2,3,4}; 1:printf("%d\n",sizeof(a)); 2:printf("%d\n",sizeof(a+0)); 3:printf("%d\n",sizeof(*a)); 4:printf("%d\n",sizeof(a+1)); 5:printf("%d\n",sizeof(a[1])); 6:printf("%d\n",sizeof(&a)); 7:printf("%d\n",sizeof(*&a)); 8:printf("%d\n",sizeof(&a+1)); 9:printf("%d\n",sizeof(&a[0])); 10:printf("%d\n",sizeof(&a[0]+1));
例题1
int a[] = {1,2,3,4}; printf("%d\n",sizeof(a));
这里的a表示整个数组,计算的是整个数组的大小,因此这里的结果为
4(数组元素) * 4(int类型所占大小)=16
例题2
int a[] = {1,2,3,4}; printf("%d\n",sizeof(a+0));
注意这里a+0的a并不是整个数组,而是表示的首元素的地址
因为只有数组名单独在sizeof()括号里时,才表示整个数组,当数组名不是单独在sizeof()括号里时就仅表示数组首元素地址,虽然二者地址是一样的,但是本质是有区别的,因此a+0实际为&a[0],&a[0]的大小为4或者8个字节
为什么这里a+0!=a[0]呢?,因为a+0本质还是一个地址,而a[0]就是数组的一个元素,并不是地址,因此只有*(a+0)才等于a[0]
例题3
int a[] = {1,2,3,4}; printf("%d\n",sizeof(*a));
*a是数组的首元素,即 * a=a[0],sizeof(a[0])=4(整形类型的大小)
例题4
int a[] = {1,2,3,4}; printf("%d\n",sizeof(a+1));
这道题其实和例题2基本上是一样的,a+1表示的是数组首元素的地址往后移一位,即a+1=a[1],因此为sizeof(a+1)的结果为4或者8个字节
这里其实可以直接得出答案,因为我们知道这里的a是首元素地址,因此既然a+1还是地址,那么地址的大小就是4或者8个字节
例题5
int a[] = {1,2,3,4}; printf("%d\n",sizeof(a[1]);
计算的是第二个元素的大小为4个字节(int类型的大小)
例题6
int a[] = {1,2,3,4}; printf("%d\n",sizeof(&a));
&a在之前我的一篇博客中有提到,能取整个数组地址的方式只有两种,一种是sizeof(数组名),另一种则是&(数组名)
因此**&a是整个数组的地址,既然是地址那么结果还是4或者8个字节**
例题7
int a[] = {1,2,3,4}; printf("%d\n",sizeof(*&a));
这里的**&a是整个数组的地址**,* 对整个数组解引用,因此sizeof( *&a)就是计算的整个数组的大小,所以结果就是16
例题8
int a[] = {1,2,3,4}; printf("%d\n",sizeof(&a+1));
&a是表示整个数组的地址,这里的+1不是让数组的首元素地址移动到下一位,而是直接跳过整个数组
既然是数组的地址,那么依然是4或者8个字节
例题9
int a[] = {1,2,3,4}; printf("%d\n",sizeof(&a[0]));
&a[0]是取的数组首元素地址,所以大小为4或者8个字节
例题10
int a[] = {1,2,3,4}; printf("%d\n",sizeof(&a[0]+1));
上题已经说了既然是首元素地址,因此这里的+1就是跳到下一个元素的地址,&a[0]+1=&a[1],大小是4或者8个字节
例题输出结果
字符数组一
char arr[] = "abcdef"; 1:printf("%d\n", sizeof(arr)); 2:printf("%d\n", sizeof(arr+0)); 3:printf("%d\n", sizeof(*arr)); 4:printf("%d\n", sizeof(arr[1])); 5:printf("%d\n", sizeof(&arr)); 6:printf("%d\n", sizeof(&arr+1)); 7:printf("%d\n", sizeof(&arr[0]+1));
例题1
char arr[] = "abcdef"; 1:printf("%d\n", sizeof(arr));
由于sizeof是只管求数组里的内存大小,而对于字符串是由字符’a’ ‘b’ ‘c’ ’ d’ ‘e’ ‘f’ '\0’组成,而一个字符的大小为一个字节,因此最后的输出结果为
7(字符串中的字符个数)*1(一个字符的内存大小)=7
例题2
char arr[] = "abcdef"; 1:printf("%d\n", sizeof(arr+0));
arr+0在之前说过,这里的arr不是整个数组的地址,是首元素的地址,因此arr+0=arr[0],既然是地址那么结果就是4或者8
例题3
char arr[] = "abcdef"; 1:printf("%d\n", sizeof(*arr));
arr为数组首元素地址,对arr解引用就是数组的第一个字符a,因为是char类型,所以结果就是1
例题4
char arr[] = "abcdef"; 1:printf("%d\n", sizeof(arr[1]));
这里求的是第二个字符b,所以结果是1
例题5
char arr[] = "abcdef"; 1:printf("%d\n", sizeof(&arr));
&arr是整个数组的地址,所以既然是地址那么结果就是4或者8
例题6
char arr[] = "abcdef"; 1:printf("%d\n", sizeof(&arr+1));
&arr+1是跳过整个数组,但是仍然是地址,所以还是4或者8
例题7
char arr[] = "abcdef"; 1:printf("%d\n", sizeof(arr[0]+1));
arr[0]+1跳过一个元素,所以就是arr[1],但是还是地址,所以仍然是4或者8