C语言中数组何时转指针?

举报 回答
C语言中数组何时转指针?
问在线客服
扫码问在线客服
  • 回答数

    4

  • 浏览数

    3,123

举报 回答

4个回答 默认排序
  • 默认排序
  • 按时间排序

没找到满意答案?去问秘塔AI搜索
取消 复制问题
结论是:不能直接将数组名赋值给普通指针以实现指向整个数组的效果。
在C语言中,数组名在多数表达式中会自动转换为指向其首元素的指针,但存在若干例外情形(如作为sizeof、&或_Alignof的操作数时除外)。当前语境下,该用法不属于例外情况,因此arr被隐式转换为指向int类型的指针,即等价于&arr,而非&arr。尽管&arr与&arr在数值上地址相同,二者类型却截然不同:前者是int*,后者是int(*)。
而你所举的正确示例——`int (*p) = &arr;`——中,右侧的&arr属于前述例外之一,结果类型为指向含3个int的数组的指针;左侧声明的p亦为同类型指针,类型完全匹配,故p真正成为指向整个数组的指针。
遗憾的是,当前不少教材及教学实践常将数组名的隐式转换与指针类型混为一谈,甚至部分授课者对此理解不清。这种模糊处理易造成概念混淆。须知,即便是最基础的数组取元素操作(如arr),其底层也依赖该隐式转换机制:先将arr转为指针,再执行偏移与解引用。
取消 评论
正确的写法应为 `int *p = &arr;` 或直接 `int *p = arr;`。虽然数组名 `arr` 在多数情况下会退化为指向首元素的指针,但 `&arr` 的类型是指向整个数组的指针,与 `&arr` 类型不同。例如,若 `arr` 是 `int`,则 `&arr` 类型为 `int(*)`,而 `&arr` 为 `int*`。部分编译器会对类型不匹配的赋值发出警告。
取消 评论
除了定义那儿、取地址那会儿,基本都自动转啦~比如传参、做运算,全按指针来使
取消 评论
当函数参数传、跟下标混着用、参与加减运算……反正一不留神它就悄悄变指针了
取消 评论
ZOL问答 > C语言中数组何时转指针?

举报

感谢您为社区的和谐贡献力量请选择举报类型

举报成功

经过核实后将会做出处理
感谢您为社区和谐做出贡献

扫码参与新品0元试用
晒单、顶楼豪礼等你拿

扫一扫,关注我们
提示

确定要取消此次报名,退出该活动?