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

首先我们进行一个实验:

    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获取其大小。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 13,164评论 1 51
  • void* 类型指针:通用变体类型指针;可以不经转换,赋给其他指针,函数指针除外;malloc返回的就是void*...
    冰吉凌阅读 8,704评论 0 18
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 8,853评论 3 44
  • C语言指针的总结 1. 变量 不同类型的变量在内存中占据不同的字节空间。 内存中存储数据的最小基本单位是字节,每一...
    xx_cc阅读 9,433评论 11 39
  • 我坐上车马上就要离开成都了,来过很多次,唯独这一次来和走的时候都是如此心情沉重,没有了你,对我而言它也就是...
    有毒勿扰阅读 1,643评论 0 0

友情链接更多精彩内容