关于c语言形参实参传地址传数值的问题

主函数main(){intx=1,y=3;fun(x,y);}voidfun(inta,intb){intt;t=a;a=b;b=t}最后x,y输出1,3main(){i... 主函数main()
{int x=1,y=3;
fun(x,y);
}
void fun(int a,int b)
{int t;t=a;a=b;b=t}
最后x,y输出1,3
main()
{int x=1,y=3;
fun(&x,&y);
}
void fun(int *a,int *b)
{int t;t=*a;*a=*b;*b=t}
结果是3,1
类似的一个
void fun(int *a,int *b)
{int *c;
c=a;a=b;b=c;}
main()
{int x=3,y=5,*p=&x,*q=&y;
fun(p,q);fun(&x,&y);}执行printf("%d%d",*p,*q);结果都是3,5 3,5
请详解此类题目,17号考二级,急急急,真诚感谢
展开
 我来答
张飞online
2015-11-03 · TA获得超过483个赞
知道小有建树答主
回答量:277
采纳率:0%
帮助的人:147万
展开全部
C语言中函数的参数传递(值传递,地址传递,引用传递)
/* ^_^ 2015年11月3日09:58:03 辨析 C语言中函数的参数传递*/

//值传递 其实质是将数值传递给其他俩个变量,自己变量里面的值并没有改变----所以说是值传递。
# include <stdio.h>
void exchange();
int main (void)
{
int x,y;
x=3;
y=4;
exchange(x,y); //这就是典型的值传递,它把X,Y的值传递给变a和b;
printf("%d %d\n",x,y); //a,b的值进行交换,但是变量X,Y里面的值并没有交换。
return 0;
}
void exchange(int a,int b)
{
int temp;
temp =a;
a=b;
b=temp;
printf("%d %d\n",a,b);
}
//地址传递 (提到地址二字,应该始终明确,C语言中的地址是基于指针的,所以地址传递是一定会用指针的)
# include <stdio.h>
void exchange();
int main (void)
{
int x,y;
x=3;
y=4;
exchange(&x,&y); //这就是典型的地址传递,它把X,Y变量地址传递给指针a和b;
printf("%d %d\n",x,y); //*a,*b的值进行交换,就是找到a,b对应的地址交换地址里面的值,其实也就是
//找到 a,b值进行交换。
return 0;
}
void exchange(int *a,int*b)
{
int temp;
temp =*a;
*a=*b;
*b=temp;
printf("%d %d\n",*a,*b);
}
chiconysun
2011-09-07 · TA获得超过2.2万个赞
知道大有可为答主
回答量:5410
采纳率:92%
帮助的人:2414万
展开全部
void fun(int a,int b)
{int t;t=a;a=b;b=t}
这是传值,就是说实参只是将值复制给了形参后,两者没有关系,形参的变化不影响到实参

void fun(int *a,int *b)
{int t;t=*a;*a=*b;*b=t}
函数体内通过传递进来的地址值,间接将外面变量存储的内容修改了*a=*b;*b=t

void fun(int *a,int *b)
{int *c;
c=a;a=b;b=c;}
虽然这个也是传递的地址,但是在函数体中只是将各个形参存储的值(也就是指针形参所指向的变量)做了修改,但是并没有上一个的间接修改外面变量的内容,当然也是不变了
追问
好像有点懂,能不能具体说说函数中哪是实参形参,我对这个定义不太理解
追答
形参用于函数声明和原型中,实参用于函数调用中
main()
{int x=3,y=5,*p=&x,*q=&y;
fun(p,q);fun(&x,&y);} fun中都是实参

void fun(int a,int b)
{int t;t=a;a=b;b=t}

void fun(int *a,int *b)
{int t;t=*a;*a=*b;*b=t}

void fun(int *a,int *b)
{int *c;
c=a;a=b;b=c;}
中的a b都是形参
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
左丘蓝兰
2011-09-09 · TA获得超过150个赞
知道小有建树答主
回答量:547
采纳率:0%
帮助的人:380万
展开全部
void f(int * &ptr)是自定义函数!
无返回值!参数类型为指向int型变量的指针变量!即参数&ptr的类型是指向int型变量的指针!那就很好解释啦!
int *ap = arr,实际上是 int *ap = &arr[0],
分开写就是:
int *ap;
ap = &arr[0];
故 f(ap) 相当于 f(&arr[0]) 传的参数是指向int型变量的指针!正确!
而 f(arr) 中 arr 是错误写法,数组单独使用必须加下标!
但指针指向数组时!可以写成:ap = arr 相当于 ap = &arr[0]
但单独使用 arr 是错误的!它什么也不是!更不会是指向int型变量的指针,它不存在!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lbgtbr09
2011-09-07
知道答主
回答量:7
采纳率:0%
帮助的人:1.2万
展开全部
实参就是被调用的值也就是x,y
形参就是调用函数的变量也就是a,b
void fun(int a,int b)这仅仅是值的传递 所以不会影响x,y的值
而void fun(int *a,int *b)指针是地址传递所以结果会传递
追问
还有这样的一个
void swap1(int c[])
{int t ;
t=c[0];c[0]=c[1];c[1]=t;}
void swap2 (int c0,intc1)
{int t;
t=c0;c0=c1;c1=t}
void main ()
{
int a[2]={3,5},b[2]={3,5};
swap1(a);swap2(b[0],b[1]);
printf("%d%d%d%d",a[0],a[1],b[0],b[1]);
}
结果是 5 3 3 5
哪位高手也给解释下
追答
void swap1(int c[])
是数组 按址传递
void swap2 (int c0,intc1)
这是按值传递 注意不是数组
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zmytbf511
2011-09-08 · 超过19用户采纳过TA的回答
知道答主
回答量:66
采纳率:100%
帮助的人:25.8万
展开全部
等待解释
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式