二重指针变量做形参的目的是为了能在被调函数中改变指针变量的值

先看一段代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void function1(int *v)
{
 v = (int *)malloc(sizeof(int));
 *v = 100;
}
void main()
{
 int *v = NULL;
 function1(v);
 printf("%d\n",*v);
}

其实这段代码不能运行,为什么?形参不是传递的指针吗?又不是值传递。现在的脑子里有了值传递和指针传递这个概念,但却没有真正理解函数参数传递的本质。

现在忘掉什么值和指针那些乱七八糟的东西。

你现在只要想明白,指针就是一个变量,存放的是地址,不过也是一个值罢了,只不过特殊一点。再明确一点,函数参数的传递实际上是一个拷贝的过程,而且离奇的是,都是拷贝。

现在回答我吧,主函数function1(v)是不是传递了一个值给被调函数?(虽然这个值是一个地址)那么被调函数就把这个值复制了下来。现在他执行了v = (int *)malloc(sizeof(int));这样一条语句,这条语句什么意思?申请一块内存,并把这块内存的地址返回给v。这时主函数和被调函数中的指针指向的东西没有半毛关系了,主函数中v还是NULL

以前讲的是在被调函数中改变main函数实参的值,用指向实参的指针传值就行,现在,是要在被调函数中改变指针的指向,当然要用指向指针的指针(二重指针)。

怎么修改呢?再看下面的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void function2(int **v)
{
 *v = (int *)malloc(sizeof(int));
 **v = 10;
}

void main()
{
 int *v;
 function2(&v);
 printf("%d\n",*v);
}

被调函数要求传递指针变量的地址,好,那就把主函数中某个指针的地址复制过来。注意*v = (int *)malloc(sizeof(int));这条语句分配一块内存,返回给谁呢?是二重指针的地址还是指针呢?当然是指针,想明白。(在被调函数中**v代表指针指向的值,*v代表指针,v代表指针的地址),也许你还不明白,看个图。

会发现,我们只是把指针的地址复制了过来,但这个地址仍然指向这个指针,明白了吧。

其实有一种简单方式,在被调函数外面先分配好内存,再把指针传递进去,或者干脆在被调函数里面定义指针,分配内存,然后返回指针就好了,这样不容易出错。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值