刚学完数据结构中的线性表内容,对几种形参传值还是传地址的情况做了一些总结:

  第一种:通过形参穿值的方式修改程序中变量

  举个栗子!

 void  change(int   a)                10>>5   地址:3000

{                                                           变量:a

    a = 5;

}

 void main()                            10       地址:2000

{                                                         变量:num

   int  num  = 10;

  change(num);

  printf("num = %d",num);

}

  很明显,程序得目的是想通过调用子函数修改变量num得值,如果对传值传地址这方面不了解的同学,一定会脱口而出num = 5

  很抱歉,输出的结果是num = 10。

  并不是子函数功能失效了,主要原因就在于子函数和主函数中变量的地址没有相对应。

  正如我写在程序右边的地址信息,假设主函数存放num变量的地址是2000,子函数存放a变量的地址是3000,通过change(num)形参传值的方式,将num = 10传进了子函数,利用子函数的功能将num变量修改为5,此时num = 5,但是最后差的一步是,子函数中的地址跟主函数地址完全不一样,没法将修改后的num=5返回给主函数,因此主函数打印出来的,依旧是一开始定义的num = 10。

要想真正达到子函数和主函数地址对应,就要用到以下第二种形参传一级地址的方式

第二种:通过形参穿一级地址的方式修改程序中变量

void change(int *p)                       10>>5   地址:3000>>2000

{                                                                  变量:p

  *p = 5;

}

void main()                                  10>>5       地址:2000

{                                                                变量:num

  int num = 10;

change(&num);

printf("num = %d",num);

}

这一次,打印出来的num = 5,妥妥的完成了变量的修改

正如你所见,chagne(&num)通过地址传递的方式,将子函数的地址由3000变成了2000,这就使得两者内存地址一致,换句话说,主函数拥有了对子函数的控制权,可以轻而易举的将子函数中已经被修改的变量num拿给自己用,并完整地打印出来。

posted on 2018-08-27 21:29  五月525  阅读(245)  评论(0编辑  收藏  举报