int test(int input,int test[ ]);
//不管传进来的一维数组里面存多少个数据,形参都不管,只写明数组存放的数据类型(在这里是int)即可
int test(int input,int test[ ])
//不管传进来的一维数组里面存多少个数据,形参都不管,只写明数组存放的数据类型(在这里是int)即可
{
//数组的名字退化为第一个元素的地址,此时test是test数组的首地址,取*意思是首地址中存放的数据
//所以下一句中的x=1
int x = *test;//此时test的值是0x0012f2f0
test++;
int y = *test;
//经过上一步test的值是0x0012f2f4 (因为int在当前机器中是占4个字节,所以指针+1,地址移动4个字节0x0012f2f0+4)
input +=10;//此时i变为110
int iNum = sizeof(int); //int类型数据在当前机器占用字节数量
test++;
test[0]=100;
//经过上一步指针移动此时test值是0x0012f2f4+4=0x0012f2f8
return input;
}
void main(void) // 良好的代码风格
{
int i = 100;
int t[5] = {1,2,3};//假设数组t的首地址是0x0012f2f0
int re = test(i,t);//将数组名传进去即可,即传递进去的是t的首地址0x0012f2f0
//函数调用结束,由于i是值传递,此时i的值恢复为100
//函数调用结束,由于数组t是引用传递,将地址传递进来,修改了地址内存放的数据,故函数调用结束,传递进来的地址没变,但地址里面存放的数据变了,此时t[0]=100 但t的值即数据t的首地址没变,依然是0x0012f2f0
}
其实传数组的引用也还是传递的数组的地址的值,依然是值传递,传进去的是数组的地址值,函数调用结束该地址值不变,但是数组里面存放的数据可以变。
题外话:
事实上,关于C函数的参数传递规则可以表述如下:
所有传递给函数的参数都是按值传递的。
但是,当数组名作为参数时就会产生按引用传递的效果,如上所示,规则和现实行为之间似乎存在明显的矛盾之处,后面会对此作出详细的解释。