您的位置:首页 > 其它

函数中的传指针

2014-01-23 19:24 176 查看
在C中函数传参的理解,是常常面试的一个热点。我觉得书里说的:常把函数传参,分成两种方式,按值传递、按地址传递,这样分开感觉,很易让人迷惑,给人的感觉好像有两种不同的传递方式。

其实我觉得表述成:函数传参,只是传给变量的一份拷贝。这样就说完了,如果你要想在函数里改变传入的值,可以把变量的地址传进去,这样我们在函数里就知道变量的地址了,地址虽然是拷贝的,但我们只要改变地址所指向内存位置的值,就完成了改变传入的值。

函数传参数就是传递变量的一个份拷贝,就是这一种,只是当传递的是一个保存一个内存地址的变量时(指针),还是拷贝这个参数。指针,因其保存的是一个其它变量的地址,在函数里面,通过它,我们知道了一个内存的具体的地址,这样我们就能通过这个内存地址来改变这个内存位置的值而已。所以传递一个地址,感觉就是利用指针的一种小技功而已。

看看常常拿出来的问题,常出下面两个函数定义

void fun_test(char *p);

void fun_test1(char **p);

关于fun_test理解
p是一个指针,但也是一个变量,做为变量,它就是按值传递的,p指针变量传到fun_test里,其本身还是拷贝赋值的,如果在fun_test里调用malloc为其分配内存,分配的地址还是给的其拷贝,所以调用结束,p的内存并没有得到,而出现了内存的泄漏。在函数里面,p虽然只是拷贝,但这个拷贝的指针,指向的地址和函数外指外的地址还是一样的,这样就能改变它指向的内容。

如下示例说明:
char *p;

char ac[255] = {0};

p = ac;

fun_test(p);

在函数内部,我们不管怎么样虐待p,fun_test调用出来后,p还是指向ac,还是老样了,但改变了p指向的内容,则ac的内容就变了。

这样定义的用途:

1:函数是按值传递的,按地址传递,在函数内部改变变量的值,中国的教科书上一般教对这点说了。2:对一些对像引用传递,这样不用再分配内存。

关于fun_test1理解

void fun_test1(char **p);

为什么需要这样的定义,这个有什么用?

改变一下定义方式

void fun_test1(char *(*p));

对于这样的定义,我们在调用时,一般是这样使用:

char *p;

fun_test1(&p);

“&p”这样的操作,相当于定义了一个变量,这个变量是指向p的地址的,假设名为 pp

就像下面的:

char *p;

char **pp =&p;

fun_test1(pp);

把pp传递给fun_test1,实际上还是按值传递,函数调用会产生pp的一份拷贝,这份拷见指向的同样是 p这个地址,这样在fun_test1里我们就可以为p分配内存,而不会丢失,如下:

fun_test1(char **p){

  *p = malloc(10);

}

*p改变的是传入指针变量pp的地址所指向的指针变量地址的值。

就可以这样的使用,(常见的拿来面试的了):

char *p;

fun_tset1(&p);

strcpy(p,"123");

printf(p);

free(p);

这样定义的用途:

见到一个类似这样定义:void fun(char **p),把指针的指针做为参数的,基本大多数情况下,就暗示这个函数会在内部为其分配内存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: