关于C/C++中的数组转换为指针的问题

本文探讨了C++中数组与指针的关系,解释了为何在某些情况下x==&x,以及sizeof(x)和sizeof(x+1)为何不同。重点在于理解数组到指针的隐式转换以及在地址运算符、sizeof运算符和字符串初始化时的特殊行为。通过这些,我们可以更好地掌握C++中数组和指针的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看下面这段代码

为什么会出现上面的情况?按理说 &x 不应该是 x 的地址吗,不管它们的值是什么,至少它们应该是不相同的。

这里就涉及到数组转换指针的问题了。

当我们定义了一个数组变量 x 时,大家的第一反应应该都是 x 指的是数组第一个元素的地址,但是这不完全正确。

确实,当我们尝试去输出 x ,或者将 x 作为参数传递给函数,其表现出来的效果就是 x 是数组首元素的地址。但是,其实其中存在一个隐式转换(implicit conversion)的过程,即将数组类型隐式转换为指针类型。

但是,这种转换并不是任何情况下都会发生的,存在例外:

1、作为地址操作符(&)的操作数

2、作为 sizeof 的操作数

3、被字符串常量初始化了的字符数组

就是说以上三种情况下,数组类型是不会被隐式转换为指针类型的,这就能解释很多问题了。

1、为什么 x == &x

因为 &x 中的 x 没有发生类型转换,所以 x 是数组类型,&x 意为数组 x 的地址,即数组的起始地址;而 x 发生了类型转换,变成了int *,指的是数组第一个元素的地址。所以它们是相同的。

2、为什么 sizeof(x) = 8 而 sizeof(x+1) = 8

这两个8不是一个意思。sizeof(x) = 2 * sizeof (int) = 8;而sizeof(x+1) = 指针数据类型所占字节数 = 8(因为是64位下)。

利用上面的第二条结论,sizeof(x)中的 x 为数组类型,所以 sizeof() 得出的就是数组 x 所占的内存空间,为 2 * 4 = 8。而 sizeof(x+1) 中,由于先进行加法,x 被转换为 int *,所以 sizeof() 得出的就是指针数据类型的字节数,32位系统下为4,64位系统下为8。

3、为什么输出char数组可以直接输出字符串

 根据第三条结论也就不难得出了。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值