一、二重指针传参意义(函数体内malloc申请内存泄漏与变量引用的就近原则)

谭浩强C程序设计讲到,如果想交换两个变量a,b的值,我们会这么做:

func(int* a,int* b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = *a;
}
func(&a,&b);

因为C语言单向“值传递”就这样规定的,想改变外部实参a和b的值,你就要传实参的地址才行,没有可理解的,你就是要按照规定来,就像没一个汉字读什么,都是最初的规定者规定的。

指针就有这个特权,当函数参数是一个一重指针的时候,那么传入的就应该是变量的地址。

那么在函数的内部就可以直接通过修改该地址中存放的值。这样就能修改到外部变量的值了。

现在进一步思考,如果函数内部不是修改变量的值,而是指针的值及变量地址的值,又会怎样呢?没错这回就得用到二重指针。

可能有人会问,修改指针的值是想干嘛?修改指针的值的另一种说法就是:

1、将A指针指向另一个B指针变量

1.1 譬如int c=5;int* A=NULL;int *B=c;你现在想将A指向指针B,一般我们直接使用A=B;即可,如果你想封装成函数呢?这时就要传入指针A的地址,才能改变A的指向。

func(int *B,int** A)
{
    (*A)=B;
}
void main()
{
    int c=5;int* A=NULL;int *B=c;
    func(B,&A);//这样其实等同于A=B;你会问为什么一行代码可以解决的还需要函数封装?是为了模块化,是因为这个例子比较简单
}

1.2 如果你形参定义成int *A,传入func(A,B)则无法改变指针A的指向。比如 int* p = a,如果需要将其封装成函数,就会造成在函数中修改指针值的情况。假设一个功能函数需要为指针分配一个新的空间:

func(int* a)
{
    a = malloc(10);
}
void main()
{
    int* p;
    func(p);
}

func(p)执行完了之后

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值