函数中的传指针

在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),把指针的指针做为参数的,基本大多数情况下,就暗示这个函数会在内部为其分配内存。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
函数指针指针函数是C语言的两个重要概念,它们虽然涉及到指针函数的结合使用,但实际上表示了不同的含义和用法。 1. 函数指针(Function Pointer)是指可以指向函数指针变量。通过函数指针,我们可以在程序运行时动态地调用不同的函数函数指针的定义和用法如下所示: ```c // 定义函数指针 返回值类型 (*指针变量名)(参数列表); // 使用函数指针调用函数 指针变量名 = 函数名; 指针变量名(参数列表); ``` 例如,我们可以定义一个函数指针变量`p`,指向一个返回类型为`int`、参数列表为`int`的函数,并通过函数指针调用该函数: ```c int add(int a, int b) { return a + b; } int (*p)(int, int); // 定义函数指针变量 p = add; // 指向add函数 int result = p(3, 4); // 调用add函数,返回结果7 ``` 2. 指针函数是指返回指针类型的函数指针函数的定义和用法如下所示: ```c // 定义指针函数 返回值类型 *函数名(参数列表); // 使用指针函数返回指针 返回值类型 *p = 函数名(参数列表); ``` 例如,我们可以定义一个指针函数`getMax`,返回类型为`int*`,参数列表为两个`int`类型的数值,并返回较大的数值的指针: ```c int* getMax(int a, int b) { if (a > b) { return &a; } else { return &b; } } int a = 3, b = 4; int *p = getMax(a, b); // 返回较大的数值的指针 int result = *p; // 获取指针指向的数值,结果为4 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值