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

先看下面这段代码

为什么会出现上面的情况?按理说 &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数组可以直接输出字符串

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值