美文网首页程序员
c数组名与指针&sizeof相关(4.3update)

c数组名与指针&sizeof相关(4.3update)

作者: AwesomeAshe | 来源:发表于2016-03-12 12:09 被阅读71次

    首先我们进行一个实验:

        char str[] = "asdfg";
        char *pstr = "asdfg";
        std::cout << sizeof(str) << " " << sizeof(pstr);
    

    得到的结果是:6,4

    同样的,我们再试一下:

    size_t size2(int a[])
    {
        return sizeof(a);
    }
    size_t Size3(int* a)
    {
        return sizeof(a);
    }
    int main()
    {
        
        int arr[20];
        std::cout << sizeof(arr) << " " << size2(arr) << " " << Size3(arr)<<std::endl;
        std::cout<<sizeof((int*)a);
    
    }
    
    

    得到的是:80,4,4,4

    我们发现只有直接引用数组名的时候,得到的size才是数组的大小

    为什么会这样呢?

    • 我们经常说数组名就是指针,其实不太严谨。数组名和普通的指针有一些不一样。数组名是一个常量指针,我们不可以改变其值。
    • 在某些情况下其语义会发生改变,比如sizeof(name_of_array)的时候,数组名代表的是一个数组,因此我们可以得到数组的大小
    • 对数组名取地址也是合法的
      std::cout << arr<<" "<<&arr; 得到的结果是一样的:
    指向数组名的指针.png

    但是普通的指针:

    int b = 10;
    int* a = &b;
    std::cout << a << " " << &a<<" ";
    

    这两个的结果是不同的:

    普通指针的地址
    • 在函数的参数传递过程中,地址常量可以退化成对应的指针
      就比如size2(int a[])函数一样,数组名不再代表数组,而是转换为普通的指针,指针(32位下)占4个Byte

    4.3更新:

    • 如果sizeof的对象是函数,则返回函数返回值类型大小;
      并且不会去执行函数;
      同理如果sizeof的对象是表达式,也是返回表达式结果的类型大小,而不执行表达式。

    • 注意c_style字符串末尾有一个\0结束符,也需要占一个char空间,因此sizeof("1") 返回2。而strlen返回的是字符数,不包括\0结束符。

    • sizeof 无法获取动态分配的内存大小,即使用malloc动态的分配内存,无法使用sizeof获取其大小。

    相关文章

      网友评论

        本文标题:c数组名与指针&sizeof相关(4.3update)

        本文链接:https://www.haomeiwen.com/subject/giexlttx.html