在阅读本文章之前,我们应该先明白三点基本的内容。
我们都知道数组名表示首元素地址,但是一下两种情况的数组名表示的是整个数组
1.sizeof后加数组名表示整个数组,计算整个数组的大小
2.&后加数组名表示整个数组的地址
需要我们特别注意的是除了以上两种情况之外其余情况均表示数组首元素。
弄清楚以上的关系之后我们来看一个简单的代码
#include<stdio.h>
int main
{
int a[4]={1,2,3,4};
printf("%d",sizeof(a));
return 0;
}
根据我们刚才所讲的内容很容易明白此时输出的结果应该是16,
#include<stdio.h>
int main()
{
int a[4]={1,2,3,4};
printf("%d",sizeof(a+0));//此时sizeof后面已经不是单纯的数组名而是有其他符号
return 0;
}
那么此时的输出结果应该是多少呢?
由上文我们可以知道此时的结果应该是4/8在32位架构中是4在64位架构中是8
如果你已经理解了上述的情况那么下面一种情况的结果应该是多少呢?
#include<stdio.h>
int main()
{
int a[4]={1,2,3,4};
printf("%d",sizeof(*a));
return 0;
}
根据我们前两段所了解的,此时应该输出的是4/8
#include<stdio.h>
int main()
{
int a[4]={1,2,3,4};
printf("%d",sizeof(&a));
return 0;
}
那么这个代码输出的结果应该是什么呢?
我们知道&+数组名表示整个数组的地址,所以自然有同学觉得此时应该输出16,
但是我们要明白的是&之后无论如何已经变成了地址,在计算机中我们要明白一个地址的大小是4个字节,所以此处输出的结果是4。
通过上述四段代码的学习,是否已经弄懂了指针和地址的关系了呢?
接下来我们看一段更加复杂的代码
#include<stdio.h>
int main()
{
int a[4]={1,2,3,4};
printf("%d",sizeof(*&a));
printf("%d",sizeof(&a+1));
printf("%d",sizeof(&a[0]+1));
return 0;
}
那么上面三个代码的输出值应该是什么呢?
此处我们留给读者自行解决,并会在下一期文章中讲解。
如果弄明白了以上的3个结果我们不妨再思考一个问题
第二个sizeof中到底表示的是什么呢?