为了账号安全,请及时绑定邮箱和手机立即绑定

int*p=&a[0]的含义是什么 改成int*p=&a会有什么变化

int*p=&a[0]的含义是什么 改成int*p=&a会有什么变化

C C# C++
qq_改恒_0 2017-09-10 20:11:51
查看完整描述

1 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

&a 表示取整个数组的地址,得到的是指向数组的指针

&a[0] 是直接取数组第一个元素的地址,得到的是 int 指针

不过呢,虽然 &a&a[0] 的类型不同,但它们的值是一样的。而 int *p = &a 是强行把数组指针赋值给 int 指针,所以 p 还是指向了 a 的第一个元素的地址。后续按照指向数组元素的指针来使用 p 也能正常工作。

但是注意,应该避免写 int *p = &a 这样的代码。 因为这毕竟和使用意图不符——等号左侧想要的是 int 指针类型,等号右侧却是数组指针类型——等号两侧的类型本不兼容,只不过恰好值相同且被强制转型才碰巧可以正常工作的。  而且这样的代码在编译时会得到类型不符的警告的。


另外说一种可行的写法:当你直接在等号右侧使用数组名 a 时,就等于使用 a 的第一个元素的地址,也就是 int 指针类型。

你可以写 int *p = a, 这和 int *p = &a[0] 是等价的。

查看完整回答
1 反对 回复 2017-09-10
  • qq_改恒_0
    qq_改恒_0
    那么 取别的如a[2]时 除了int*p=a[2] 还有别的写法吗
  • onemoo
    onemoo
    你可能手误了吧,应该是 int *p = &a[2]。a[2] 是第二个元素本身,要取其地址才行。 在定义 p 时写 int *p = &a[2] 显然是最合适的写法了,意图清晰明确。 不过因为指针很灵活,若单纯想要让一个指针指向 a[2] 的话,是有很多办法的。
  • qq_改恒_0
    qq_改恒_0
    可以帮忙列举一下吗 谢谢
点击展开后面1
  • 1 回答
  • 0 关注
  • 2659 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信