今天写代码,自以为只要是传递指针,就能达到自己的任何目的,比如说改变指针的所指向的内容。 一切看起来似乎很简单。
#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还是指针,都是一个道理