为何函数可接收char array作为char pointer参数且能修改其元素?
为什么char数组能传给char*形参并修改元素?
这背后是C语言的两个核心规则在起作用:数组的隐式退化,以及指针下标操作的本质。
1. 数组传参时的隐式退化
当你把数组名作为实参传给函数时,C语言会自动将数组名转换为指向数组第一个元素的指针——这就是常说的「数组退化为指针」。
对你的示例来说,changeelement(array)等价于changeelement(&array[0]),而&array[0]的类型正是char*,完美匹配函数的形参类型char *p,所以编译器不会报错。
2. 指针下标操作的本质
C语言里的p[i]只是*(p + i)的语法糖。当p指向数组的第一个元素时:
p[0]等价于*(p + 0),也就是直接访问p指向的内存地址(也就是数组第一个元素的地址)- 修改
p[0],本质就是直接修改该内存地址里的内容——而这个地址正是原数组array第一个元素的存储位置。
这也是为什么函数里修改p[0]后,main函数里的array会跟着变化:指针操作的是原数组的内存空间,不是副本。
结合你的代码具体看
char array[]="boice";
这段代码在栈上分配了一块连续内存,存储了'b','o','i','c','e','\0'这6个字符。调用changeelement(array)时,array退化为指向'b'的char*,传给形参p。p[0]='v'直接把'b'所在的内存内容改成'v',所以最后printf输出的就是voice。
额外注意
如果你传递的是字符串字面量(比如changeelement("boice")),那修改p[0]会触发未定义行为——因为字符串字面量通常存在只读内存区域,不允许修改。但你的代码里array[]是栈上的可修改数组,所以可以正常修改。
内容的提问来源于stack exchange,提问作者hooky
相关产品推荐
相关产品推荐

