这是一系列的题目。
指针的题目对于初学者,算比较折磨人的,尤其是和数组密不可分,来看看一道题目吧。
#include
int main(void)
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a + 0));
printf("%d\n", sizeof(&a));
printf("%d\n", sizeof(*&a));
printf("%d\n", sizeof(*a));
printf("%d\n",sizeof(&a+1));
return 0;
}
计算这几个的输出。
先来看看sizeof(),这个关键字。
sizeof()是计算类型的大小。以字节为单位。而上面的题也是计算括号内的类型的大小。
如:sizeof(int)------4
先来看两个规则之类的条件
sizeof(数组名)–数组名此时表示整个数组
&数组名————表示整个数组
除此之外,全都表示数组首元素地址
且,在内存中,无论什么类型元素的地址,地址大小都占4个字节大小。
1.printf("%d\n", sizeof(a));此时,a,表示整个数组,计算整个数组占内存的大小,int 占4个字节
则答案是4*4=16个字节。
2.printf("%d\n", sizeof(a + 0));此时,a+0,并不是单独一个数组名,不表示整个数组。其代表首元素地址,而地址是只占4个字节的(不知道往上看)。答案是4.
3.printf("%d\n", sizeof(&a));【数组与指针进阶|指针进阶-ONE(包含对数组的加深理解)】取地址符,符合两个条件。则代表取出数组的地址,但数组地址也是首元素,是地址,那就只占4个字节。
4.printf("%d\n", sizeof(*&a));又取地址又解引用,相互抵消了。且还是相当于单独的一个a,同上,16bytes.
printf("%d\n",sizeof(&a+1));这个&a+1与a+1不一样,a+1和第二题是一个类型,而&a则得到的是整个数组的地址,虽然与首元素是一样的 ,但是&a是一个占用4个int类型的对象的地址,而a是一个占用1个int类型的对象的地址。代表的对象不同,则指针移动大小也不一样
文章图片
但&a+1表示的依旧是地址,那就是4给字节。
还有,待发布。
如有问题,烦请大佬指点。
指针进阶-TWO
推荐阅读
- 数组与指针进阶|指针进阶-TWO
- 数组与指针进阶|指针进阶-THREE(有对指针和数组的加深理解)
- 单片机|单片机学多久能工作,单片机学好了能应聘什么工作()
- 单片机|单片机值得学吗(会单片机能找什么工作?)
- C语言系列|C语言如何把多位数的每一位提取出来,(例如(四位数2345,把个、十、百、千位提取出来)超级详解)
- PTA|本题要求编写程序,以hh:mm:ss的格式输出某给定时间再过n秒后的时间值(超过23:59:59就从0点开始计时)。
- 算法|常用的快速排序
- C语言与C++编程|C语言学习方法、学习平台及项目推荐
- csp刷题|CSP 201312-1 出现次数最多的数