C语言中两种指针参数语法形式是否完全等价?
C语言中指针参数两种语法形式的等价性分析
在C语言的函数参数声明里,int* p和int p[]这两种写法完全等价,编译器会将它们统一解析为指向int类型的指针。
这是因为C标准有明确规定:当数组类型作为函数参数时,会被自动转换为指向该数组元素类型的指针。换句话说,int p[]只是int* p的一种语法糖,写法不同,但编译后的逻辑和行为没有任何区别。
拿你给出的代码举例:
void fx1( int* p ){ *p = 10; } void fx2( int p[] ){ *p = 10; } int main(){ int a = 20; fx1(&a); fx2(&a); }
这段代码里,fx1和fx2的功能完全一致,调用它们都会把变量a的值修改为10。哪怕你在fx2里用数组下标语法p[0] = 10,效果也和*p = 10相同——因为数组下标访问p[i]本身就等价于*(p+i),而这里的p本质就是指针。
需要注意一个常见误区:虽然int p[]看起来像数组,但它并不是真正的数组。比如你不能通过sizeof(p)来获取所谓的“数组大小”,因为p是指针,sizeof(p)得到的是当前平台下指针类型的字节数,而非数组的总字节数。这一点也能侧面印证两种写法的等价性。
内容的提问来源于stack exchange,提问作者alessio solari
相关产品推荐
相关产品推荐

