数组作为函数参数的传递方法

在C语言中,数组参数是以引用(reference)形式进行传递的,也就是地址调用,而标量和常量则是按值(value)传递的。在函数中对传入的标量参数的任何修改都会在函数结束时丢失,函数调用结束时,对传入的标量参数在函数体中的修改丢失恢复到调用之前。因此,被调用函数无法修改调用函数以传值形式传递给它的参数。然而,当被调用函数修改数组参数的其中一个元素时,调用函数所传递的数组就会被实际的修改。

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函数的参数传递规则可以表述如下:

所有传递给函数的参数都是按值传递的。

但是,当数组名作为参数时就会产生按引用传递的效果,如上所示,规则和现实行为之间似乎存在明显的矛盾之处,后面会对此作出详细的解释。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值