免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1426 | 回复: 0
打印 上一主题 下一主题

函数参数传递 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-27 14:48 |只看该作者 |倒序浏览

测试例子:

#include stdio.h>
void print(char *arr)
{
    printf("%#x %#x %#x\n", &arr, arr, arr[0]);
}
int main()
{
    char arr[5] = "abcd";
    printf("%#x %#x %#x\n", &arr, arr, arr[0]);
    print(arr);
    return 0;
}
输出:
0xbf849b8b 0xbf849b8b 0x61
0xbf849b70 0xbf849b8b 0x61
对于第2,3个输出,很多人都能理解,但对第1个输出为什么不同,很多人还没有理解,认为是函数指针作为参数,进行地址传递,&arr也应该是一样的,这样想是因为对函数参数传递的实质还没有认识清楚。
不论是指传递还是地址传递,机制都是一样的,形参接收到实参传递过来的值进行使用。
当为值传递时:
实参a ----> 形参b:   b接受了a值,对b的修改,不会影响到a。
当为地址传递时:
实参*a ---> 形参*b:  b接受了a的值,此时a,b两个指针变量指向同一内存单元。对b的修改,不会影响到a,但对b指向的内存单元的修改,会导致a指向的内存单元也发生变化(因二者指向同一个内存单元)。
地址传递误区:有人认为地址传递时,b跟a就完全一样了,使用b就是在使用a(在C++的确有这样的机制,即引用),其实不然,在C中并没有引用机制,变量a在调用的函数域内不可见,需要分配一个变量b来接受a传过来的参数,然后使用b,正是这个误区导致很多人对上述例子的输出不解。
如果还对谭浩强版C语言书上一个例子(交换两个变量的值)有印象但还没有理解的,可以再回想一下。
#include stdio.h>
void swap(int *a, int *b)
{
     int *tmp = a;
     a = b;
     b = tmp;
}
void swap2(int *a, int *b)
{
     int tmp = *a;
     *a = *b;
     *b = tmp;
}
int main()
{
    int a = 3, b = 5;
    swap(&a, &b);  //并不能交换两个变量的值
//  swap2(&a, &b);
    printf("%d %d\n", a, b);
    getchar();
    return 0;
}
总而言之,值传递与地址传递仅仅是传递的变量类型不同,前者传递普通的变量,后者传递指针变量,而其传递机制是一样的。   


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/87570/showart_2162165.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP