说C语言中函数值传递与地址传递的方法

各自有什么优缺点,有什么不同,什么情况下适合用哪种,由于本问题太深奥了,我给五分,貌似我太扣了,不过我就20分,嘻嘻

先举个简单例子:
#include <iostream>
using namespace std;
void Add1(int *a)
{
(*a)++;
}
void Add2(int a)
{
a++;
}
int main()
{
int x=1,y=5;
Add1(&x);
Add2(y);
cout<<x<<" "<<y<<endl;
return 0;
}
输出:
2 5
这两个自加函数中,Add1是指针传递,Add2是数值传递,
在调用Add2(y)时,系统是先建造一个int型变量a,再将y的值传给a(此时y和a是两个不同地址的变量,只是两者值相同),然后a++,却对y没有任何操作,故在函数调用结束后,释放a,而y没任何变化;
在调用Add1(&x)时,系统先建造int型指针a,然后将实参x的地址传给了指针a,故此时a与&x是指向同一地址,即共享统一数据,当对地址a内的数据进行操作,就是对x进行操作。a++时自然也对x++,当函数调用结束,指针a释放掉,x的值此时已经发生了变化。
这就是两者不同,地址传递的参数都是指针类型,于数值传递不一样。
至于选择那种传递,就要看这个程序的具体目的和功能了,一般要对参数进行修改的要用地址传递,而只是调用参数的数据进行其他计算并不需要修改数据本身宜用数值传递。
还有什么不明白吗
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-01-23
函数值传递:原来的值不变

地址传递:原来的值变了
举个例子
int a=5;int b=3;
void temp(int a,int b) 函数值传递
{
int t;
t=a;
a=b;
b=t;
}
void main()
{
temp(a,b); 调用函数
printf("%d%d",a,b);
}
结果 a=5;b=3 并没有因为调用了函数,而变成a=3;b=5;原因就是它是函数值传递,而不是地址传递
等你到了大二,学数据结构,就会越来越发现c语言c++语言java语言的奥妙
第2个回答  2015-09-19
说C语言中函数值传递与地址传递的方法:
先举个简单例子:
#include <iostream>
using namespace std;
void Add1(int *a)
{
(*a)++;
}
void Add2(int a)
{
a++;
}
int main()
{
int x=1,y=5;
Add1(&x);
Add2(y);
cout<<x<<" "<<y<<endl;
return 0;
}
输出:
2 5
这两个自加函数中,Add1是指针传递,Add2是数值传递,
在调用Add2(y)时,系统是先建造一个int型变量a,再将y的值传给a(此时y和a是两个不同地址的变量,只是两者值相同),然后a++,却对y没有任何操作,故在函数调用结束后,释放a,而y没任何变化;
在调用Add1(&x)时,系统先建造int型指针a,然后将实参x的地址传给了指针a,故此时a与&x是指向同一地址,即共享统一数据,当对地址a内的数据进行操作,就是对x进行操作。a++时自然也对x++,当函数调用结束,指针a释放掉,x的值此时已经发生了变化。
这就是两者不同,地址传递的参数都是指针类型,于数值传递不一样。
至于选择那种传递,就要看这个程序的具体目的和功能了,一般要对参数进行修改的要用地址传递,而只是调用参数的数据进行其他计算并不需要修改数据本身宜用数值传递。
第3个回答  2012-01-23
传值调用的特点:1形参与实参占用不同的内存单元2单向传递(在被调函数中无法改变主调函数中的任何变量值)注意:函数调用时,实参的值是基本数据类型、结构体数据类型,即整型、实型、字符型、数组元素等,可以是常量、变量或表达式。但不能是数组名或指针等类型。
传址调用的特点:1,形参与实参占用同样的存储单元; 2“双向”传递; 3实参和形参必须是地址常量、变量或表达式。方式:函数调用时,将数据的存储地址作为参数传递给形参

C语言中的值传递和址传递.
都是值传递,真正的引用传递是出现在C#中,当你传指针的时候,实际上你传的是指针所指向的地址值,也就是把地址值传过去,但是这个地址值也是通过值传递过去的,即函数内的指针指向的地址值是原来的地址值的一个拷贝,但是由于地址值相同,所以你在函数内对该指针进行解指针并进行修改,你也修改了外部...

C语言的传值和传址的区别
1、在传值中函数参数压栈的是参数的副本,任何的修改是在副本上作用,没有作用在原来的变量上。2、传址中压栈的是指针变量的副本,当你对指针解指针操作时,其值是指向原来的那个变量,所以对原来变量操作。

在C语言中,函数实参与形参之间的数据传递方式是( )传递方式。
值传递。实参与形参数据传递有两种方式:值传递与地址传递。地址传递的形式为 int &a=b;也就是我们所说的引用,但引用只有C++中有,所以C语言都是值传递的。有些人有误解:认为C语言的int *p=&a;不也是按地址传递吗?其实不是这样的。深入理解值传递与地址传递就会发现:值传递是:把实参的值传给...

C语言的函数调用中怎样判断是地址传递还是值传递?
int,char,float,结构体,枚举,联合均为值传递;数组名,指针,引用均为地址传递;比如 func(int,char,float,struct S)值传递 func(int *,int a[],int &a)地址传递

C语言传值不能传地址吗?
不对,在C语言中,传值有地址传值和参数传值,参数传值只能将实参传值给形参,所以A选项正确。C语言中的外部变量是可以在函数之间传递数据的。C语言中的自动变量是默认的变量,实际上是函数中的局部变量,所以D选项正确。全局变量一经定义都是需要分配内存单元,在程序运行过程中自始至终都会占用固定的...

C语言中实际参数和形式参数的设置及传递方式
C语言中实际参数(实参)与形式参数(形参)之间的传递方式有传值和传地址两种函数调用方式。下面通过举例来说明实参和形参的设置方法以及传值与传地址的两种函数调用方式。值传递方式:include<stdio.h>void fun(int a, int b) \/\/ 此处a, b为形参{ a++; b++;}void mian(){ int ...

C语言函数调用中怎么判断是地址传递还是值传递
如果参数类型是A,那么是传值。比如,要传递int型参数:1 传值:void func(int a);2 传地址:void func(int *a);而传递char *型参数。1 传值:void func(char *a);2 传地址:void func(char **a);同样是char *类型的参数,有可能是传值,也有可能是传地址。具体取决于函数实现功能。

C语言传地址调用
1、值传递:不管怎么传,原来的实参的值都不会改变。地址传递,原来的实参的值可能被改变。打个比方:值传递就好象你告诉别人你的帐户里有多少钱 帐户里的钱不会改变。地址传递就好象你告诉别人你的帐户密码 帐户里面的钱可以被改变。2、例如:include<stdio.h> point(char *pt)main(){char b[...

C语言中调用的函数f(char *p)是值传递吗?f(int *p)是地址传递?对干两者...
f(char *p) 是传位址,p可能是一个字元的位址或者一个字串(字元阵列)的起点位址。f(int *p) 也是传位址 f(int p) 才是值传递 两者的差别在於f(int p) 在函数中改变 p值,只要跳出函数就会还原,而f(int *p)则会直接改写来源变数的值。例:void fa(int a);void fb(int *a);int ...

c语言传值和传地址
如果想将m的值返回,那么有两种办法:函数写成:void findMax(int vals[],int *m),然后函数中用到m的地方都改成*m,调用时findMax(nums,&value);函数写成:int findMax(int vals[],int m),函数最后写return m;调用时value=findMax(nums,value);如果子程序不需要value作为m的初始值,则可...

相似回答