C/C++:sizeof 详解

14 篇文章 0 订阅

代码演示

#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char* argv[])
{
    long long arr[5] = {1,2,3,4,5};       //数组
    long long* arrPoint  = arr;           //指向数组的指针
    //
    printf("%d\n",sizeof(long long));                           //long long 长度为8
    printf("arrPoint pointer:       %p\n",arrPoint);            //arrPoint  pointer:0061FEF8
    //
    printf("&arr[0] pointer:        %p\n",&arr[0]);             //&arr[0] pointer:0061FEF8
    printf("arr pointer:            %p\n",arr);                 //arr     pointer:0061FEF8
    printf("&arr[0] size:           %d\n",sizeof(&arr[0]));     //&arr[0] size:4
    printf("arr size:               %d\n",sizeof(arr));         //arr     size:40
    //
    printf("arrPoint pointer:       %p\n",&arrPoint[0]);        //arrPoint     pointer:0061FEF8
    printf("arrPoint pointer:       %p\n",arrPoint);            //arrPoint     pointer:0061FEF8
    printf("&arrPoint[0] size:      %d\n",sizeof(&arrPoint[0]));//&arrPoint[0] size:4
    printf("arrPoint size:          %d\n",sizeof(arrPoint));    //arrPoint     size:4
    //
    printf("&arr pointer:           %p\n",&arr);                //&arr    pointer  0061FEF8
    printf("&arr+1 pointer:         %p\n",&arr+1);              //&arr+1  pointer  0061FF20(0061FEF8+0x28(40))
    printf("arr pointer:            %p\n",arr);                 //arr     pointer  0061FEF8
    printf("arr+1 pointer:          %p\n",arr+1);               //arr+1   pointer  0061FF00(0061FEF8+0x8)
    //
    printf("&arrPoint pointer:      %p\n",&arrPoint);           //&arrPoint    pointer  0061FEF4
    printf("&arrPoint+1 pointer:    %p\n",&arrPoint+1);         //&arrPoint+1  pointer  0061FEF8(0061FEF4+0x4)
    printf("arrPoint pointer:       %p\n",arrPoint);            //arrPoint     pointer  0061FEF8
    printf("arrPoint+1 pointer:     %p\n",arrPoint+1);          //arrPoint+1   pointer  0061FF00(0061FEF8+0x8)
    //
    printf("arr value:              %d\n",*(arr));              //arr     value  1
    printf("arr+1 value:            %d\n",*(arr+1));            //arr+1   value  2
    //
    printf("arrPoint value:         %d\n",*(arrPoint));         //arrPoint     value  1
    printf("arrPoint+1 value:       %d\n",*(arrPoint+1));       //arrPoint+1   value  2
    return 0;
}

代码分析

  • 特性1(数据结构区别)

    • arr
      数组名,对应的是一种数据结构,而这种结构叫数组。
    • arrPoint
      指向数组的指针,对应的数据结构是指针。
  • 特性2(大小)

    由于数组和指针是不一样的数据结构, sizeof 求对应数据结构的大小,因此

    • sizeof (arr) 是数组的大小,在上述代码中为 40 字节;
    • sizeof (arrPoint) 是指针的大小,在上述代码中为 4 字节(32位编译器);
  • 特性3(数组名指向地址)

    • 指向数组的指针 arrPoint 、数组名 arr,数组首部元素的地址 &arr[0],指向是同一个地址,因此在某些程度上,数组名和指针是相似的
  • 特性4(相似性)

    • 数组名+1:arr+1、指向数组的指针+1: arrPoint+1,指向的地址是一致的,此处也证明了数组名和指针是相似的
  • 特性5(取地址+1的效果)

    • 数组名取地址+1: &arr+1、指向数组的指针+1: &arrPoint+1,效果是不一致的,前者增加了 40 个字节(数组的大小),后者增加了 4 个字节,侧面证明数组名与指针是不完全一样的

总结

数组名指向数组的指针在一定程度上有 相似性,但其并 不完全等同

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值