C 语言--函数指针形参

C语言传值与传址

今天写代码,自以为只要是传递指针,就能达到自己的任何目的,比如说改变指针的所指向的内容。
一切看起来似乎很简单。

#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还是指针,都是一个道理

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值