You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中数组名传递给函数后的行为疑问及原理解析

关于C语言数组传参后指针操作的问题解答

你的理解完全正确。printd函数中lineptr[0]输出"c"的原因,核心在于数组名作为函数参数传递时会发生隐式转换,具体细节如下:

1. 数组传参的本质:隐式转为指针

在C语言中,当你把数组名作为实参传递给函数时,数组名会自动转换为指向数组第一个元素的指针。哪怕函数参数写的是char *lineptr[],编译器也会将其解析为char **lineptr——也就是说,函数内部的lineptr是一个普通的指针变量,而非你在main里定义的数组。

2. 数组与指针的核心区别

  • main里的lineptr是数组,数组名是一个常量指针,它的指向是固定的,你不能对它执行lineptr++这类修改指向的操作(编译会报错)。
  • 而printd函数里的lineptr是指针变量,它的值可以被修改,比如通过lineptr++让它指向原数组的下一个元素。

结合代码的具体分析

  • 第一个printf("%s\n", *lineptr++);:先解引用当前指针,输出原数组第一个元素"hello",然后指针自增,指向原数组的第二个元素(即存储"c"的指针地址)。
  • 第二个printf("%s\n", lineptr[0]);:根据C语言语法,lineptr[0]等价于*(lineptr + 0),也就是当前指针指向的元素,此时指针已经指向原数组的第二个元素,所以输出"c"。

总结

函数参数中的数组写法只是C语言的语法糖,实际传递的是指针变量。因此在函数内部,你可以像操作普通指针一样修改它的指向,这和main中作为数组名的常量指针完全不同。

内容的提问来源于stack exchange,提问作者kim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:55:20