C语言传值与传址
今天写代码,自以为只要是传递指针,就能达到自己的任何目的,比如说改变指针的所指向的内容。
一切看起来似乎很简单。
#include <stdio.h>
void test(char *des, char *src)
{
des = src;
}
int main(void)
{
char *src = "hello world!";
char *des = NULL;
test(des, src);
return 0;
}
想法是:通过传值来改变指针des所指向的对象,使用函数更显紧凑,符合模块化编程。另外,如果可以的话,将test的返回值改为int,返回代码块 的错误码。这样的面向过程编程,没毛病。
现实是残酷的。
当程序运行到test的最后的括号时,打印出来两个函数中的des:
(gdb) p main::des
$2 = 0x0
(gdb) p test::des
$3 = 0x400604 "hello world"
说明,函数进行传参时,只是简单的将NULL传给了形参des,而形参des值的改变不会影响main::des;
那么,根据理论,要改变对象的值,就传递它的地址吧!
void test(char **des, char *src)
{
*des = src;
}
int main(void)
{
char *src = "hello world!";j
char *des = NULL;
test(&des, src);
return 0;
}
(gdb) p &main::des
$3 = (char **) 0x7fffffffd5e8
(gdb) p test::des
$4 = (char **) 0x7fffffffd5e8
(gdb) p main::des
$5 = 0x4006a4 "hello world"
(gdb) p *test::des
$6 = 0x4006a4 "hello world"
总结
所有函数传参都是传递一份拷贝,那份拷贝在实参和形参是独立的,互不影响。
传递指针也一样,指针也是对象,传递的是指针中存的地址值;
想通过传参改变实参的值,需要传递你想改变的变量的地址,改变变量,只要得到其地址,就可以通过解引用来改变它,不管是int还是指针,都是一个道理