Chinaunix首页 | 论坛 | 博客
  • 博客访问: 128902
  • 博文数量: 38
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 191
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-16 11:31
个人简介

嵌入式新人

文章分类

全部博文(38)

文章存档

2016年(38)

我的朋友

分类: 嵌入式

2016-07-04 16:06:44

    C语言函数传递参数的方式有3种,即传值、传址和引用,本文通过实例来说明三者的异同

传值、传址和引用的实例    
1.1 实例
    请先分析以下代码的输出结果,然后再阅读后面的说明(传值和传址可以在GCC编译器下编译通过,引用则无法通过编译)。

#include

/*-----------传值传参-----------*/
void Exchg1(int x, int y)   

int tmp; 
tmp = x; 
   x = y; 
   y = tmp; 
   printf("x = %d, y = %d\n", x, y); 

main() 

   int a = 4,b = 6; 
   Exchg1(a, b); 
   printf("a = %d, b = %d\n", a, b); 
return(0); 




/*-----------传址传参-----------*/
void Exchg2(int *px, int *py) 

int tmp = *px; 
*px = *py; 
*py = tmp; 
printf("*px = %d, *py = %d.\n", *px, *py); 

main() 

int a = 4; 
int b = 6; 
Exchg2(&a, &b); 
printf("a = %d, b = %d.\n", a, b); 
return(0); 



/*-----------引用传参-----------*/
void Exchg3(int &x, int &y)

int tmp = x; 
x = y; 
y = tmp; 
printf("x = %d,y = %d\n", x, y); 

main() 

int a = 4; 
int b = 6; 
Exchg3(a, b); 
printf("a = %d, b = %d\n", a, b); 
return(0); 

1.2 输出结果
传值传参:x = 6,y = 4,a = 4,b = 6;
传址传参:*px = 6,*py = 4,a = 6,b = 4;
引用传参:x = 6,y = 4,a = 6,b = 4;

传值、传址和引用的说明

2.1 编译器的支持
    
引用传参是C++的语法,标准C语言没有引用传参,只有传值传参和传址传参, 如GCC编译器就不支持引用传参。

2.2 传值、传址和引用本质
2.2.1 传值
    a、b将a、b的值传给x、y,实际上a、b、x和y分别是4个存储单元,Exchg1执行过程中,a和b是不参与的,仅有x和y参与,在Exchg1结束后,a和b的值是不变的,x和y由于是Exchg1的局部变量,随着函数的结束而消失。
2.2.2 
传址
    &a、&
b将a、b的地址传给px和py,实际上a、b、px和py分别是4个存储单元,*px、*py是指向a、b存储单元指针变量,因此Exchg2对*px和*py操作也就是对a和b的存储单元的操作,a和b的值会交换。

2.2.3 引用
    a、b将a、b传给x、y后,实际上a、b、x和y只有2个存储单元,即a和x是同一存储单元,b和y是同一存储单元,只是这个存储单元有两个名字而已,所以Exchg3中对x和y的操作,也就是对a和b的操作,a和b的值会交换

2.3 引用和传址的区别

 1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
 2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。

 3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

阅读(1722) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~