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,求解释!~还有,如果真要设计一个函数,交换两个数的值,请问如何设计?
对了,我知道用指针可以实现,如果不用指针呢?主要是实参和形参搞不清楚~ 展开
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,求解释!~还有,如果真要设计一个函数,交换两个数的值,请问如何设计?
对了,我知道用指针可以实现,如果不用指针呢?主要是实参和形参搞不清楚~ 展开
展开全部
在这里面,形参就是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的首地址,它其实是一个指针,这里其实是改变了指针指向的内容,指针本身没变。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
void swap(int &x,int &y)
{
int temp;
temp = x;
x = y;
y = temp;
}
{
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次输出的内存地址是不一样的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
形参是调用函数中的变量,与主函数中的变量并不相同,他有自己的存储空间,所以在交换时是对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;
}
这样也可以;希望可以帮到你;
形实结合可以这样理解:
如果形参是变量,那你的为例 只是进行赋值 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';
}
请问为什么这程序又可实现呢?按我理解,只将形参的值改变了并没改变实参,所以应该没变啊~
追答
这个是传的数组只是传的数组首地址所以也就是传的地址,可也理解为是指针
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |