指针进阶-TWO

指针进阶-ONE
先来看看sizeof()与strlen()的基本区别

sizeof()是计算类型的字节大小。

strlen()是计算字符串的长度,以’\0’结束,但是,strlen()括号内只能是地址,才能计算。strlen()要解引用一次再进行运算。只能解引用一次,诺传递一个二级指针,是错误的。strlen 会解引用一次,然后,得到那个地址会将它进行运算。所有元素,整型或字符都是以补码的形式储存在内存中。而且是十六进制。还要考虑大小端的储存模式。如,ff aa bb 00,就会读到0停止,计算得3个字节,诺,00 aa bb ff,就是0个字节。
所以说是一个随机值。

接下来,看看二维数组。

#include  <stdio.h>
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;
}

二维数组就与一维有些差别。在这里插入图片描述
二维数组可看成这个样子。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]));
printf("%d\n", sizeof(a[0]));

a[0][0],这个就是首元素,int类型,4个字节。
而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));
printf("%d\n", sizeof(*(a[0] + 1)));

要知道a[0]是和*(a+0)且a是一个意思。
a[0]+1是 * (a+0)+1,所以,这是a[0][1]的地址,而
(a[0] + 1))已经解引用了,已经得到一个元素了
而地址无论是什么类型,都是4个字节。
4byte
4byte
至于剩下的,已经在上面提到了。
指针进阶-THREE

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值