上一期文章中我们谈到指针与地址,文章的末尾我们交给大家两个问题,现在我们就这两个问题给大家分析一下
#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;
}
首先三个printf的输出值应该是16,4/8,4/8
我们知道&后加数组名表示整个数组的地址,对整个数组的地址进行解引用得到整个数组的大小为16。
同样的道理,但是为什么第二个输出的结果会是4/8呢?
在这里我们应该明白&a+1代表什么,它表示在整个数组a的地址上加1,表示跨过一个数组a,到达下一个跟数组a相邻的地址,因为是地址所以大小为4/8
由图示我们可以知道&a+1跨过一个a数组,所以它跨过的大小是16字节
同理我们就可以理解第三个sizeof中跨过了数组a中的一个元素,取到a[0]的下一个元素的地址
明白了以上内容之后我们正式开始我们的第二篇内容
#include<stdio.h>
int main()
{
char arr[]={'a','b','c','d','e','f'};
printf("%d",sizeof(arr));
printf("%d",sizeof(arr+0));
printf("%d",sizeof(*arr));
printf("%d",sizeof(arr[1]));
printf("%d",sizeof(&arr));
printf("%d",sizeof(&arr+1));
return 0;
}
有了上篇文章的基础这道题我们可以很容易的解答,只需要明白char占据一个字节
那么请大家看以下代码
#include<stdio.h>
int main()
{
char *p="abcde";
printf("%d",sizeof(p));
return 0;
}
这个代码的输出值是4,为什么呢?
我们知道sizeof加数组名表示整个数组大小,此时的情况表示的是数组首元素的地址,既然是地址那么大小就应该是4
这里值得注意的是虽然指针的类型char*,但是我们此时输出的是地址,地址无论何种数据都是四个字节
#include<stdio.h>
int main()
{
char *p="abcde";
printf("%d",sizeof(p+1));
return 0;
}
明白了上面的一个代码后,我们来看这个代码
这个代码的输出值同样是4,原因同上面一个代码,但是这里同样也有一个值得我们关注的点就是p+1表示的是什么,我们已经知道p表示的是首元素的地址,那么p+1就应该表示的是第二个元素的地址
#include<stdio.h>
int main()
{
char *p="abcde";
printf("%d",sizeof(*p));
return 0;
}
有了以上分析,我们来看一下这个代码,p表示首元素地址,对首元素地址进行解引用得到首元素,因为是char型,所以首元素的大小是1个字节
#include<stdio.h>
int main()
{
char *p="abcde";
printf("%d",sizeof(p[0]));
return 0;
}
那么这个代码输出的值是多少呢?
相信学习过指针后大家应该明白p[0]=*(p+0)那么此时输出的结果应该已经显而易见了,就表示对首元素地址进行解引用,所以输出的结果应该是1
同上一期文章一样本期文章的末尾我们也要给大家几个问题,大家自行研究之后我们在下一期文章中给大家详细解答
#include<stdio.h>
int main()
{
char *p="abcde";
printf("%d",sizeof(&p));
printf("%d",sizeof(&p+1));
printf("%d",sizeof(&p[0]+1));
return 0;
}
文章到此结束,谢谢大家的阅读!