打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
函数传值与传址的问题
首先你要认识函数传参是怎么进行的

函数传参是复制形的,举个例子说:

void modify(int a)
{
a++;
}

void main()
{
int a=5;
modify(a);
printf("%d",a);
}
这个程序的答案还是5。为什么?
因为当调用modify(a)时,在执行modify函数时,是另外开辟了一个内存空间,将main中a的值复制过来,modify函数中所有的操作都是相对于这个新开辟的内存空间而言的,对原来的a没有任何改变。

现在就来说说指针,如果用指针传参的话那就完全不一样了,指针(pointer),说白了即是指向变量内存地址。同样上面的例子:
void modify(int * a)
{
(*a)++;
}

void main()
{
int a=5;
modify(&a);
printf("%d",a);
}
这个答案当然是6
因为你传进去的是a的地址,所以在modify函数中的操作都是对a地址上的内容进行操作,即是操作a所以modify函数不用返回这个数,main中a的值也会改变。因为大家都是操作同一个内存空间,而上面不用指针,modify操作的是另一个新开辟的内存空间,只是这个内存空间初始值和a一样。


现在来说说传参,其实你“为什么函数参数是字符串的多用指针?” 那句我不是很明白,C中的字符串传参好像就指针一种形式(除非用结构体)。
何时用指针,何时用拷贝。当传的参数是一个结构体,而这个结构体比较大,这时最好用指针,因为如果用拷贝的话,单单花在拷贝的时间就要浪费很多,而如果这个函数经常被调用,那么这效率问题就出现了。

你在子函数中要对你的主调用函数中变量进行操作时也可以用指针做参数,这样子函数就可以不用return 如果不是用指针的话,就要再子函数的未尾加上一条return x;把这个数返回当返回值。

多看点书,多写点程序,刚开始学都会对指针比较迷茫。写多了,自然而然就懂了。
 
 
 
我的感觉就是高效! 

回答者: 2WDragon - 五级  

2009-11-30 17:02

检举   
第一,可以用指针修改指针指向的变量,否则只改变此变量的拷贝第二,利用指针的指针增加安全性“字符串的多用指针”是指char *argv[]吧 

回答者: polluto - 二级  

2009-11-30 17:06

检举   
1,回调函数,例如signal(int,sighandler_t)动态改变调用void sort(void* beg,void*end,bool(*compare)(viod *a,void*b) );2字符串数组当参数会自动变成指针int foo(char a[]);int foo(const char* a);一样 

回答者: grpubr - 一级  

2009-11-30 17:07

检举   
指针说白了就是地址,内存变量的地址。指针作参数说不上有什么优点。就是当你在子函数中要对你的主调用函数中变量进行操作时就必须用到指针做参数,也就是把主调用函数中变量的地址传到被调用函数中去,这样才能实现对主调函数变量的操作。如果不是用指针变量,而是一个普通变量的话是无法传递主函数的变量地址的,这里涉及到函数的传值和传址的区别。如果不了解这个最好找个书看看,一定要仔细理解。对于你的“为什么函数参数是字符串的多用指针?”这句话我不是太理解。至于何时该用指针何时不该用,我上面已经说清楚了。如果你是C语言的初学者可能会不太理解,那么你就仔细去研究一下教材吧。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
什么情况下使用指针的引用(指针)
指针数组与数组指针详解
c++形参实参
函数调用中实参和形参变化问题
带参数的无返回值(void)函数如何返回处理结果(附代码)
指针作为参数传递
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服