C语言中为何用指针声明函数参数中的数组?附代码示例疑问
C语言数组作为函数参数:指针写法的原因与原理
一、为什么用指针声明数组参数?
在C语言里,数组作为函数参数传递时,本质就是传递数组首元素的地址——不管你写int T[]还是int *T,编译器都会把它当成指针处理。这么做的核心原因有两个:
- 效率更高:如果直接传数组,会拷贝整个数组到函数里,数组越大越费内存、拖慢程序速度。传指针只需要传一个地址(通常4或8字节),开销极小。
- 能修改原数组:像
create函数需要给数组赋值,传指针可以直接操作原数组的内存空间。要是传数组拷贝,修改的只是副本,原数组根本不会有变化。
二、工作原理与逻辑
当你在main里调用create(T, n)时,数组名T会自动转换成指向数组首元素的指针(也就是&T[0])。函数里的int *T接收这个地址后,T[i]等价于*(T + i)——意思是从首地址往后偏移i个int大小的内存位置,直接操作原数组的元素。
三、为什么只有Create用指针写法?
这只是写法上的差异,两种写法完全等价!把print的int T[]改成int *T,或者把create的int *T改成int T[],程序运行结果完全一样。示例只是故意用两种写法展示:不管写数组形式还是指针形式,编译器都会当成指针处理。
比如把print改成指针写法,效果丝毫不差:
void print(int *T,int n){ int i; for(i=0;i<n;i++) printf("[%d]",T[i]); }
另外要注意:函数参数里的int T[]不能指定大小(比如写int T[100]),编译器会直接忽略这个大小,还是当成指针。所以不管用哪种写法,都必须额外传n来告诉函数数组长度,不然函数没法知道数组有多少元素。
内容的提问来源于stack exchange,提问作者haloum
相关产品推荐
相关产品推荐

