C语言 值传递和地址传递
不少同学在学到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
在这个程序中用指针变量作参数,虽然传送的是变量的地址,但实参和形参之间的数据传递依然是单向的
“值传递”,即调用函数不可能改变实参指针变量的值。但它不同于一般值传递的是,它可以通过指针间接
访问的特点来改变指针变量所指变量的值,即最终达到了改变实参的目的。
C语言 值传递和地址传递的更多相关文章
- C语言:值传递,地址传递和引用传递(example:值交换)
于C语言中值传递.地址传递和引用传递的我个人理解. 通过一个例子:swap(交换两个整型变量的值)来表现! #include <stdio.h> void swap1(int* a,int ...
- C语言参数传递(值传递、地址传递)+二级指针
参数传递 C语言参数传递一般分为:值传递和地址传递(本质上只有值传递) (注意:C语言中没有引用传递,C++才有引用传递,因为很多C语言环境是用C++编译器编译,使得C看起来支持引用传递,导致很多网上 ...
- c语言进阶9-值传递与地址传递
一. 函数的值传递 函数的值传递是指参数为基本类型时,如整型.浮点型.字符型(特指单字符型)时,参数传递时是从实参拷贝一份值传给形参,形参的变化不会影响实参的值. 1. 基本类型做参数 ...
- “equals”有值 与 “==”存在 “equals”只是比较值是否相同,值传递,==地址传递,null==a,避免引发空指针异常,STRING是一个对象==null,对象不存在,str.equals("")对象存在但是包含字符‘''
原文链接:http://www.cnblogs.com/lezhou2014/p/3955536.html "equals" 与 "==" "equa ...
- go语言基础之结构体做函数参数 值传递和地址传递
1.结构体做函数参数值传递 示例: package main //必须有个main包 import "fmt" //定义一个结构体类型 type Student struct { ...
- Java中的值传递和地址传递(传值、传引用)
首先,不要纠结于 Pass By Value 和 Pass By Reference 的字面上的意义,否则很容易陷入所谓的“一切传引用其实本质上是传值”这种并不能解决问题无意义论战中.更何况,要想知道 ...
- Java中不得不谈的值传递和地址传递
个人的一些认识,希望能对初学Java的你,或者困惑于方法参数传递的你祈祷一丝帮助! 下面是一些作者的个人观点,如果有错,欢迎各位大牛指出错误,灰常感谢您的观看与支持... -------------- ...
- C#函数的参数传递方式1(值传递与地址传递)
using System; namespace class1 { class program { static void Main(string[] args) { //值传递引用,实际参数不会变化 ...
- 【转】javascript中值传递,地址传递,引用传递的问题(使用js创建list对象时会用到)
function initEditModal_SI(node) { if (node.siArray == undefined) { node.siArray = new Object(); } va ...
随机推荐
- Python从线程获取函数返回值
Python中利用强大的threading模块可以很容易的实现多线程开发,提高运行速度.这一般是对某个进行大量计算操作的的函数进行多线程处理,然后合并各线程的结果.获取函数返回值的方法可以如下: 1) ...
- Python基础(二)之字符串
字符串在python语言中极为常用,下面就带大家来一起回顾一下字符串常用的方法: 1.count 作用:统计字符串中字符的个数 例: str_yu = 'xiAoyuhaha' print(str_y ...
- "\r\n","\r","\n"
参考: http://blog.csdn.net/xiaofei2010/article/details/8458605 '\r' : 回车符 '\n' : 换行符 以下是c++语言的测试代码, 跟平 ...
- ADXL3xx: 读取 ADXL3xx 加速度传感器
原文链接:https://www.arduino.cc/en/Tutorial/ADXL3xx ADXL3xx加速度传感器 本教程将为你展示如何读取Analog Devices的ADXL3xx系列加速 ...
- mysql数据库的一些基本操作
下面列出一些做项目时常用到的一些mysql操作. 1.对数据库的操作 查看所有的数据库:show databases; 新建一个数据库:create database database_name; 此 ...
- OJ提交题目中的语言选项里G++与C++的区别(转)
G++? 首先更正一个概念,C++是一门计算机编程语言,G++不是语言,是一款编译器中编译C++程序的命令而已. 那么他们之间的区别是什么? 在提交题目中的语言选项里,G++和C++都代表编译的方式. ...
- 第二周:Java For循环方法简介
1.for循环的作用 Java当中循环的意思就是让Java程序重复地执行某些语句.在程序设计时,常常需要处理大量的重复动作, 采用循环结构可以降低程序书写的长度和复杂度可使复杂问题简单化,提高程序的可 ...
- (转) TexturePacker 3.0 使用教程
著名的TexturePacker 已经升级到3.0了,下载地址: http://www.codeandweb.com/texturepacker 免费 license 申请地址: http://www ...
- canvas生成二维码,并下载保存为本地的图片
function getTicket(id,salt){//qrcode生成canvas二维码 $(".zc-mask").show(); $(".edit-box&qu ...
- Nopcommerce 二次开发2 Admin
Admin 菜单 增加 siteMap.config增加一行 <siteMapNode SystemName="Hotels" nopResource="Admin ...