刚学完数据结构中的线性表内容,对几种形参传值还是传地址的情况做了一些总结:
第一种:通过形参穿值的方式修改程序中变量
举个栗子!
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拿给自己用,并完整地打印出来。