C语言的问题(关于形参和实参的赋值问题)

#include<stdio.h>intmain(){voidswap(int,int);inta,b;scanf("%d%d",&a,&b);swap(a,b);pri... #include<stdio.h>
int main()
{
void swap(int,int);
int a,b;
scanf("%d %d",&a,&b);
swap(a,b);
printf("%d,%d\n",a,b);
return 0;
}

void swap(int x,int y)
{
int m;
m=x;
x=y;
y=m;

}

为什么输入3 4,输出的也是3,4,而不是4,3,求解释!~还有,如果真要设计一个函数,交换两个数的值,请问如何设计?
对了,我知道用指针可以实现,如果不用指针呢?主要是实参和形参搞不清楚~
展开
 我来答
乐VoV乐
2013-03-29 · 知道合伙人软件行家
乐VoV乐
知道合伙人软件行家
采纳数:289 获赞数:877
深圳市潮范文化传播有限公司软件工程师.

向TA提问 私信TA
展开全部
调用函数有2种方式,传值和传地址。
传值,就是你现在程序中的调用方式,这样不能够改变传递进来实参的值。
传地址,就是形参是引用或者是指针,这样才能改变传递进来实参的值。
这就是区别。
抬头望那苍穹
2013-03-29 · 超过24用户采纳过TA的回答
知道答主
回答量:112
采纳率:0%
帮助的人:51.6万
展开全部
在这里面,形参就是x和y,实参就是a和b。调用函数并不会改变参数的值,所以a和b没有改变。你说的对,通过指针就可以了。可以通过指针改变指向的地址的方式来改变值
追问
int main()
{
void d_s(char str[],char ch);
char c,str[80];
gets(str);
scanf("%c",&c);
d_s(str,c);
printf("%s\n",str);
return 0;
}
void d_s(char str[],char ch)
{int i,j;
for(i=j=0;str[i]!='\0';i++)
if(str[i]!=ch)
str[j++]=str[i];
str[j]='\0';
}
请问为什么这程序又可实现呢?按我理解,只将形参的值改变了并没改变实参,所以应该没变啊~
追答
str是数组名,但是实际上是数组str的首地址,它其实是一个指针,这里其实是改变了指针指向的内容,指针本身没变。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友f9959ba
2013-03-29 · 超过18用户采纳过TA的回答
知道答主
回答量:76
采纳率:0%
帮助的人:39.2万
展开全部
void swap(int &x,int &y)
{
int temp;
temp = x;
x = y;
y = temp;
}
追问
想问一下这具体为什么可以?&x指的是x的地址,那后面为什么又成了x呢?
追答
&x 是x 的地址 x就是地址里面的值,你要修改的是地址里面的值所以就是x,
void main()
{
int a = 3,b = 4;
void swap(int,int);
cout<<"&a="<<&a<<" "<<"&b="<<&b<<endl;//输出ab的地址
swap(a,b);
cout<<a<<" "<<b<<endl;
}
void swap(int x,int y)
{
cout<<"&x="<<&x<<"\n"<<"&y="<<&y<<endl; //输出地址
int temp;
temp = x;
x = y;
y = temp;
}
如果是想上面这样也就是你原来的那样以值传递进来,这里会重新开辟内存来存放的并把原内存的值进行拷贝,你里面修改的只是对新内存的值进行了修改,所以原内存的值不会变的。
程序执行完毕后你会发现上下 2次输出的内存地址是不一样的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chuanqi781
2013-03-29 · 超过13用户采纳过TA的回答
知道答主
回答量:32
采纳率:0%
帮助的人:33.3万
展开全部
形参是调用函数中的变量,与主函数中的变量并不相同,他有自己的存储空间,所以在交换时是对swap里的xy进行交换并没对主函数的实参进行改变,
形实结合可以这样理解:
如果形参是变量,那你的为例 只是进行赋值 x=a;y=b;
如果是引用 那么 x就是a,,y就是b;
如果是指针 那么 x指向a; y指向b;
所以指针和引用是可以的;
可以尝试一下 函数变为 void swap(int &x,int &y) 就可以了;
或者: void swap(int*x,int *y)
{
int m;
m=*x;
*x=*y;
*y=m;

}
这样也可以;希望可以帮到你;
追问
int main()
{
void d_s(char str[],char ch);
char c,str[80];
gets(str);
scanf("%c",&c);
d_s(str,c);
printf("%s\n",str);
return 0;
}
void d_s(char str[],char ch)
{int i,j;
for(i=j=0;str[i]!='\0';i++)
if(str[i]!=ch)
str[j++]=str[i];
str[j]='\0';
}
请问为什么这程序又可实现呢?按我理解,只将形参的值改变了并没改变实参,所以应该没变啊~
追答
这个是传的数组只是传的数组首地址所以也就是传的地址,可也理解为是指针
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式