Chinaunix首页 | 论坛 | 博客
  • 博客访问: 289969
  • 博文数量: 95
  • 博客积分: 618
  • 博客等级: 中士
  • 技术积分: 455
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-28 13:39
文章分类

全部博文(95)

文章存档

2015年(65)

2013年(1)

2012年(10)

2011年(19)

分类: C/C++

2015-06-24 23:52:52

值传递:

形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,

不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。

指针传递:

形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作

C语言中没有引用传递

 

下面的代码对此作出了细致解释(从实参,形参在内存中存放地址的角度 说明了问题的本质,容易理解 


点击(此处)折叠或打开

  1. #include<stdio.h>

  2. void change1(int);
  3. void change2(int *);

  4. int main()
  5. {
  6.     int n = 8;
  7.     printf("实参地址 %d\n",&n);
  8.     change1(n);
  9.     printf("*****执行change1,结果:n = %d",n);
  10.     change2(&n);
  11.     printf("*****执行change2,结果:n = %d",n);


  12.     return 0;
  13. }

  14. void change1(int n)
  15. {
  16.     printf("值传递 函数操作地址%d\n", &n);
  17.     n++;
  18. }


  19. void change2(int * n)
  20. {
  21.     printf("指针传递 函数操作地址%p\n", n);
  22.     int temp;
  23.     /* 此处不可写为 *n = *n + 1;编译器会报错:错误: 双目运算符 * 操作数(‘int’和‘int *’)无效*/
  24.     temp = *n;
  25.     *n = temp + 1;
  26. }


运行结果如下

点击(此处)折叠或打开

  1. 实参地址 -1080956420
  2. 值传递 函数操作地址-1080956448
  3. *****执行change1,结果:n = 8
  4. 指针传递 函数操作地址0xbf91e9fc
  5. *****执行change2,结果:n = 9

可以看出,实参的地址为1080956420

采用值传递的时候,函数操作的地址是1080956448并不是实参本身,所以对它进行操作并不能改变实参的值

接下来是指针传递,也可发现操作地址是实参地址

指针传递的实质:

指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,

即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的

任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值



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