指针进阶-ONE
先来看看sizeof()与strlen()的基本区别
sizeof()是计算类型的字节大小。
strlen()是计算字符串的长度,以’\0’结束,但是,strlen()括号内只能是地址,才能计算。strlen()要解引用一次再进行运算。只能解引用一次,诺传递一个二级指针,是错误的。strlen 会解引用一次,然后,得到那个地址会将它进行运算。所有元素,整型或字符都是以补码的形式储存在内存中。而且是十六进制。还要考虑大小端的储存模式。如,ff aa bb 00,就会读到0停止,计算得3个字节,诺,00 aa bb ff,就是0个字节。接下来,看看二维数组。
所以说是一个随机值。
#include
int main(void)
{
int a[3][4]={0};
printf("%d\n",sizeof(a));
printf("%d\n", sizeof(a[0][0]));
printf("%d\n", sizeof(a[0]));
printf("%d\n", sizeof(a[0] + 1));
printf("%d\n", sizeof(*(a[0] + 1)));
printf("%d\n", sizeof(a + 1));
printf("%d\n", sizeof(*a));
return 0;
}
【数组与指针进阶|指针进阶-TWO】二维数组就与一维有些差别。
文章图片
二维数组可看成这个样子。a[0],a[1],a[2],元素里存放的是首元素的地址。而a+0,a+1,a+2又代表a[0],a[1],a[2],的地址。*(a+0)==a[0],
*(a+1)=a[1]。
但实际上,数组在内存中储存的模式是这样的,跟一维数组一样。
文章图片
二维数组像a[0][2],a[2][3],这样的其实都是以指针的形式进行调用。
*( *(a+0)+0)--------a[0][0]这样也是在加深对指针的理解。
*( *(a+2)+3)--------a[2][3]
好了开始看题目。
printf("%d\n",sizeof(a));根据上一篇文章讲的,此时a代表整个二维数组,所以是3 * 4 * 4=48byte。
printf("%d\n", sizeof(a[0][0]));a[0][0],这个就是首元素,int类型,4个字节。
printf("%d\n", sizeof(a[0]));
而a[0]就有点怪怪的,a[0]是代表&a[0][0]。但是,又不是表示这一个元素因为可以自己试试,a+1与a[0]+1表示的地址的不同。a[0]代表一整行。a[0][0]只是代表这一个元素。所以,sizeof(a[0])代表一整行的字节数,4*4=16byte.
printf("%d\n", sizeof(a[0] + 1));要知道a[0]是和*(a+0)且a是一个意思。
printf("%d\n", sizeof(*(a[0] + 1)));
a[0]+1是 * (a+0)+1,所以,这是a[0][1]的地址,而(a[0] + 1))已经解引用了,已经得到一个元素了
而地址无论是什么类型,都是4个字节。
4byte
4byte
至于剩下的,已经在上面提到了。
指针进阶-THREE
推荐阅读
- 数组与指针进阶|指针进阶-ONE(包含对数组的加深理解)
- 数组与指针进阶|指针进阶-THREE(有对指针和数组的加深理解)
- 单片机|单片机学多久能工作,单片机学好了能应聘什么工作()
- 单片机|单片机值得学吗(会单片机能找什么工作?)
- C语言系列|C语言如何把多位数的每一位提取出来,(例如(四位数2345,把个、十、百、千位提取出来)超级详解)
- PTA|本题要求编写程序,以hh:mm:ss的格式输出某给定时间再过n秒后的时间值(超过23:59:59就从0点开始计时)。
- 算法|常用的快速排序
- C语言与C++编程|C语言学习方法、学习平台及项目推荐
- csp刷题|CSP 201312-1 出现次数最多的数