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

szieof 操作符

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

    求教: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   ·   我们的愿景   ·   实用小工具   ·   5205 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 07:13 · PVG 15:13 · LAX 00:13 · JFK 03:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.