不少同学在学到C语言的指针部分时感到很困惑,对经常提到的“值传递”和“地址传递”两个概念弄不

明白。实际上,因为地址本身也可以作为一个特殊的“值”,所以地址传递也是一种特殊的值传递。只是为

了强调其特殊性,故称之为“地址传递”。我们在学习过程中可以视参数的形式而区别对待,比如若参数传

递的是简单数据类型的数值,则将其归类为值传递方式;若参数传递的是变量的地址,则视其为地址传递
方式。

值传递过程:

值传递过程中,被调函数的形参作为被调函数的局部变量处理,即在内存的堆栈中开辟空间以存放由主调

函数放进来的实参的值,从而成为了实参的一个拷贝。值传递的特点是被调函数对形参的任何操作都是作  

为局部变量进行,不会影响主调函数的实参变量的值。 

地址传递:

而在地址传递过程中,被调函数的形参虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是

由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存

放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的

实参变量。 

下面我们用书上出现频率最高的一个程序来分别实现值传递过程和地址传递过程。  

 void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
printf("\n(swap):%d,%d\n",x,y);
}
void main()
{
int a,b;
scanf("%d,%d",&a,&b);
if(a<b) swap(a,b);
printf("\n(main):%d,%d\n",a,b);
}

这显然是一个值传递的过程。假设我们从键盘输入两个数据:5,9,先来看一下运行结果:

(swap):9,5

(main):5,9

按照值传递的特点,我们可以很清楚的看到,虽然在swap函数中暂时使得运行结果显示了交换后的数据,

即达到了交换的目的,但实际情况却是随着swap函数的结束,被作为局部参数的形参x,y以及swap函数

本身的局部参数temp都将结束其生存期,在内存中的存储空间被释放。因此实参a,b的并未受到影响,

依然保持原值。

从这道程序中我们也可以学到一个方法,比如有时不需要修改实参,但是又需要被调函数所作的工作能够

得以体现,就可以灵活的在被调函数中使用打印语句。因此上面的程序可以改写为:

 void swap(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
printf("\n从大到小排列的顺序为:%d,%d\n",x,y);
}
main()
{
int a,b;
scanf("%d,%d",&a,&b);
if(a<b) swap(a,b);
}

在输入5,9两个数字后,得到的执行结果是:

从大到小排列的顺序为:9,5

你看这样就可以使用相对容易理解的值传递方式,巧妙的解决问题了,并得到了想要的答案,虽然我们并

未真正的让主函数中的两个变量发生改变。

再来看地址传递方式:

 void swap(int *p,int *q)
{
int temp;
temp=*p;
*p=*q;
*q=temp;
}
void main()
{
int a,b;
int *pointer_1=&a,*pointer_2=&b;
scanf("%d,%d",&a,&b);
if(a<b) swap(&a, &b);
printf("\n%d,%d\n",a,b);
}

假设我们从键盘输入两个数据:5,9,先来看一下运行结果:

9,5

在这个程序中用指针变量作参数,虽然传送的是变量的地址,但实参和形参之间的数据传递依然是单向的

“值传递”,即调用函数不可能改变实参指针变量的值。但它不同于一般值传递的是,它可以通过指针间接

访问的特点来改变指针变量所指变量的值,即最终达到了改变实参的目的。

 

最新文章

  1. 协议森林17 我和你的悄悄话 (SSL/TLS协议)
  2. 【jQuery示例】遍历表单数据并显示
  3. C# List泛型集合中的GroupBy&lt;&gt;用法
  4. 用mysql触发器实现log记录
  5. 【iOS】FMDB封装,查询自动mapping
  6. clientTop scrollTop offsetTop
  7. POJ 1062 昂贵的聘礼 解题报告
  8. iOS UIKit:Auto Layout
  9. asp.net 批量下载实现(打包压缩下载)
  10. 「Poetize10」封印一击
  11. Android平台的事件处理机制和手指滑动例子
  12. MySQL(root用户)密码重置
  13. Oracle两张表关联批量更新其中一张表的数据
  14. Eclipse常用不常用快捷键
  15. atomic详解
  16. Python中getopt()函数的使用
  17. ACM-ICPC 2018 焦作赛区网络预赛- L:Poor God Water(BM模板/矩阵快速幂)
  18. 【线程】Thread中的join介绍
  19. Oracle和MySQL的高可用方案对比【转】
  20. Python:基本运算、基本函数(包括复数)、Math模块、NumPy模块

热门文章

  1. java和h5 canvas德州扑克开发中(一)
  2. java日期处理SimpleDateFormat等
  3. queue
  4. Tomcat服务相关
  5. (Collection)347. Top K Frequent Elements
  6. expdp远程导出数据
  7. 【转载】变更MySql数据存储路径的方法
  8. metasploit用法
  9. 关于MariaDB5.5不是有效的Win32 应用程序
  10. 来自 Thoughtram 的 Angular 2 系列资料