szieof 操作符 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codechaser
V2EX    C

szieof 操作符

  •  
  •   codechaser 2018-10-30 16:57:50 +08:00 3316 次点击
    这是一个创建于 2612 天前的主题,其中的信息可能已经有所发展或是发生改变。

    求教:sizeof 可以返回对象的字节数。

    1

    int array[5] = {0}; int bytes = sizeof array; 

    这里的 bytes 等于 20。那么如果定义一个函数:

    2

    void test(int array[]){ printf("%d\n",sizeof array); } 

    如果传入 array 的话会打印出 4,我刚才看了下书知道里计算的是 array 这个指针,指针一直为 4 字节,所以会输出 4。那么 1 中 sizeof 也是对 array 这个数组的第一个元素指针操作啊,为什么不输出 4,而输出整个数组的字节数呢?难道sizeof还变吗?它怎么知道传入的是数组还是指针呢?

    18 条回复    2018-11-01 17:19:08 +08:00
    newmind
        1
    newmind  
       2018-10-30 17:05:25 +08:00 via Android
    标题看的我强迫症犯了
    cyang812
        2
    cyang812  
       2018-10-30 17:12:32 +08:00
    @newmind 有点
    chenstack
        3
    chenstack  
       2018-10-30 17:17:22 +08:00
    1 中 array 类型是 int[5],2 中 array 类型是 int[],也就是 int*,所以结果不一样
    zhicheng
        4
    zhicheng  
       2018-10-30 17:21:08 +08:00 via iPhone
    参数里的全是指针。
    GeruzoniAnsasu
        5
    GeruzoniAnsasu  
       2018-10-30 17:26:26 +08:00
    本站已跟百度达成深度合作。。。
    codechaser
        6
    codechaser  
    OP
       2018-10-30 17:49:06 +08:00
    @newmind 我...打错了
    bytelee
        7
    bytelee  
       2018-10-30 17:51:47 +08:00
    理解下数组和指针的区别 :)
    fcten
        8
    fcten  
       2018-10-30 17:53:03 +08:00
    数组作为作为函数参数传递时,实际传递的是指针。sizeof 自然只能计算出指针的长度,因为这个时候根本不知道数组的长度。
    chiu
        9
    chiu  
       2018-10-30 18:06:02 +08:00 via Android
    两个 array 类型不一样,一个数组一个指针。
    innoink
        10
    innoink  
       2018-10-30 18:09:56 +08:00 via Android
    int [5]和 int []又不是同一个类型,当然不一样了
    HHehr0ow
        11
    HHehr0ow  
       2018-10-30 21:08:11 +08:00
    sizeof 是一个 compile time 的运算符
    msg7086
        12
    msg7086  
       2018-10-30 21:40:53 +08:00
    sizeof 是编译时运算符,编译完以后的代码是
    int bytes = 20;
    printf("%d\n", 8);
    运行程序并不会改变 8 的值,无论函数的输入是什么样的数组,8 就是 8。
    LGA1150
        13
    LGA1150  
       2018-10-30 21:53:07 +08:00 via Android
    @msg7086 @HHehr0ow
    sizeof 有一个特例是 VLA (变量长度的数组),其大小是在运行时才确定的
    stevenbipt
        14
    stevenbipt  
       2018-10-30 23:20:07 +08:00 via Android
    定义一个指针指向数组
    stevenbipt
        15
    stevenbipt  
       2018-10-30 23:20:34 +08:00 via Android
    然后在 sizeof 那个指针试试←_←
    codechaser
        16
    codechaser  
    OP
       2018-11-01 14:45:11 +08:00
    @stevenbipt 想着指针的指针的指针最后会到哪儿?谁是他们最初的起源呢
    codechaser
        17
    codechaser  
    OP
       2018-11-01 14:46:03 +08:00
    @msg7086 sizeof 返回的值编译的时候就会替换成常量是吗?
    msg7086
        18
    msg7086  
       2018-11-01 17:19:08 +08:00
    @LGA1150 嗷对,还有这新(?)玩意儿……

    @codechaser 如上所说,除开 VLA 以外都是编译时就得出值的。
    至于指针,就只是一个内存地址而已。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1019 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 18:47 PVG 02:47 LAX 10:47 JFK 13:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86