C指针 - 地址运算篇(1) - sizeof(基础)

对数组与地址概念的明确

#includ<stdio.h>

int main()
{
    int arr[5] = {1,2,3,4,5}
    return 0;
}

如上创建了一个简单的整型数组a,对于这行代码我们需要明确以下两个点:

       · arr - 数组名 - 也是数组首元素的地址

       · arr因为是首元素的地址,是一个常量,所以不可以赋值或者自增自减(error:arr+=1)

地址的大小:我们知道计算机的存储是用二级制序列的,一个地址唯一标识一块内存空间,地址本身也是一种内容,也会被存储在内存中,如果在x32的机器上,那么就有32bit用来存储一个内容,而8bit为1字节,所以地址的大小为4个字节,x64位机器上同理为8个字节。

实例讲解:

        printf("%d",sizeof(arr));

解析

        首先我们需要明晰关键字 sizeof() 的作用:

        sizeof() 是一个C中的关键字,用于计算所传入内容的大小,单位字节

        但是有一种情况例外:

                sizeof(数组名),此时sizeof计算的是整个数组的大小

        那么上边的结果就很容易得到了:arr是一个整型数组,这里计算的是整个数组的大小,一个整形的大小为4个字节,整个数组的大小则为4*5=20

答案:20

        printf("%d",sizeof(arr+0));

解析:

        arr是数组的首元素地址,arr+0就是将该地址向后移动0个 int* 指针单位,也就是还是首元素地址,到那时不同的是,这里的内容不再是数组名了而是一个单纯的地址,地址的大小为4(x32)或8(x64)。

答案:4或8

        printf("%d",sizeof(&arr));

解析:

        小补充:arr虽然是首元素地址,但是&arr就不再是取出首元素的地址了,而是取出整个数组的地址,即:&数组名 - 取出的是整个数组的地址,在值上与首元素地址相同,但是当进行加减运算时,其变化的长度是不同的,arr+1是首元素地址+1,指向第二个元素,但是&arr+1则是跳过整个数组,增加一个数组大小的长度,直接指向了数组最后一个元素后的位置。

        但是 sizeof() 只会计算传入数据的大小,也就是说,即使是整个数组的地址,它还是一个地址,地址是不分高低贵贱的,只要是地址,其大小都是4或8。

答案:4或8

         printf("%d",sizeof(*arr));

解析:

        arr是首元素地址,首元素地址解引用拿到首元素,因为是整形数组,所以每个元素都是整形,整形的大小为4个字节

答案:4

         printf("%d",sizeof(arr+1));

解析:

        arr是首元素地址,首元素地址加一为第二个元素的地址,其依旧为地址,所以大小为4或8个字节

答案:4或8

        printf("%d",sizeof(arr[1]));

解析:

        首先明确arr[1]的含义:以arr为起始地址向后移动1个单位(4个字节,因为是int数组),然后将它的内容拿出来,(这里可以把 [] 理解为一次解引用,在后边分析二维数组的时候会容易很多),所以起始就是计算数组中下标为1的元素的大小,因为是整形数组,所以大小为4

答案:4

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值