c语言 函数调用 swap函数 一定要用指针吗

#include<stdio.h>intmain(){voidswap(inta,intb);inta,b;scanf("%d%d",&a,&b);swap(a,b);p... #include<stdio.h>
int main()
{
void swap(int a,int b);
int a,b;
scanf("%d %d",&a,&b);
swap(a,b);
printf("%d %d",a,b);
return 0;
}
void swap(int a,int b)
{
int t;
t=a;
a=b;
b=t;
}
为什么这个函数没有实现交换?而把printf函数放在swap函数里却可以实现交换。我在网上查,都说要用指针,不用指针不行吗?
#include<stdio.h>
int main()
{
void f(int a,int b,int c);
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
f(a,b,c);
printf("%d %d %d\n",a,b,c);
return 0;
}

void f(int a,int b,int c)
{
void swap(int *a,int *b);
if(a>b)
swap(&a,&b);
if(a>c)
swap(&a,&c);
if(b>c)
swap(&b,&c);
// printf("%d %d %d\n",a,b,c);
}

void swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
为什么这个函数也没实现排序?把printf函数放在f()函数中却可以实现。可能是我有误区,希望各位大侠帮帮小弟。在线等。
谢谢大家的详细解答!都是我的老师啊!再次不盛感谢!
展开
 我来答
大野瘦子
高粉答主

2019-07-03 · 繁杂信息太多,你要学会辨别
知道小有建树答主
回答量:1227
采纳率:100%
帮助的人:33.8万
展开全部

不一定。

void swap(int a,int b)

{

int t;

t=a;

a=b;

b=t;

}

这样写,只是传了一份拷贝给a,b,交换好后,栈清空,没有传回给你原来所要交换的数。而printf放里面可以是因为你的那份拷贝(即a,b)的值是跟你要交换的数一样的,所以行得通。

不用指针的方法就是:

void swap(int &a,int &b)
{

int t;

t=a;

a=b;

b=t;
}
这样就可以了,这个传进去的是原先数据的地址,地址都改变了,值也就交换了。

扩展资料:

关于指针与swap函数

1、用变量的指针交换,其实只是用指针名及指针运算符*访问变量 ,修改了变量的值。

int temp;

int *pa=&a;

int *pb=&b;

temp=*pa; *pa=*pb;*pb=temp;

2、用变量的引用交换,用”别名“访问变量

int temp;

int &aa=a;

int &bb=b;

temp=aa; aa=bb;bb=temp;

3、变量直接交换,用变量名访问变量,修改了变量的值

int temp;

int a=5;

int b=6;

temp=a; a=b; b=temp;

4、2的变形

int* temp;

int* pa=&a; int* pb=&b;

temp=pa; pa=pb;pb=temp;

cout<<*pa<<endls //-----指针交换了指向的地址,如果用*pa访问变量,此时就算是交换了,但是a和b没有交换。

LastAreas
推荐于2017-12-16 · 超过15用户采纳过TA的回答
知道答主
回答量:31
采纳率:0%
帮助的人:32.4万
展开全部
两个问题归根结底都是参数传递的问题:
对于你的交换函数swap(int a, int b)来说,如果你不使用指针,在函数内,操作的实际上是a和b的一份副本,从上层来说,可以这样理解,在调用swap之前,系统做了这样的调用:
int temp_a = a;
int temp_b = b;
swap(temp_a, temp_b),也就是说在swap中,你操作的实际上是temp_a和temp_b,最终结果不会对a、b造成影响,当然这种理解并不精确,只是为了方便说明;
而传递指针时,传递的实际上是参数的地址,例如,对于函数:
void swap(int *a, int *b),打个比方,如果a的地址是0xA,b的地址是0xB,这个地址对整个进程空间都是一致的,函数内部对地址内的值进行操作,因此最终会影响到a和b的值。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
超级奶爸头子
2011-07-26 · TA获得超过668个赞
知道小有建树答主
回答量:1111
采纳率:0%
帮助的人:610万
展开全部
如果不用指针的话,调用swap函数时,那么形参和实参一点关系也没有的,传进去的参数是重新拷贝一份实参的值,函数对拷贝的值操作,一点也不影响实参。如果用指针的话,那么传进去的不是拷贝实参的值,而是一对对实参的引用,引用就意味着只要对引用操作其实根本是对实参的操作。swap(int *a,int *b) swap(int a,int b)是大不相同的,前者函数里所有的操作既是对实参操作,而后者根本不会影响到传进去的实参
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
nbv345nbv345
2011-07-26 · 超过19用户采纳过TA的回答
知道答主
回答量:82
采纳率:0%
帮助的人:50.6万
展开全部
第一个问题void swap()只是交换了形式参数的值a,b,而不是实际a,b的值,形式参数和实际参数在内存中占用不同的存储空间,所以你只交换了了形式参数的值a,b,而不是你用 scanf("%d %d",&a,&b);输入的a,b值。可以这样改:
#include<stdio.h>
int main()
{
void swap(int a,int b);
{
scanf("%d %d",&a,&b);
int t;
t=a;
a=b;
b=t;
printf("%d %d",a,b);
return 0;
}
}
否则只能用引用和指令

这俩个问题是一个错误,说有没有必要回答2了,在说一下,在c语言中子函数的参数是分配在内存区域的堆栈上,什么是堆栈呢,就是一执行完这个函数,为形参分配的空间就会被释放,也就是说a,b就不存在了,这样做是为了,动态回收内存空间。是由操作系统自动完成的。有点像java的内存自动回收器,呵呵,其实不一样。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
c246809753
2011-07-26 · 超过10用户采纳过TA的回答
知道答主
回答量:60
采纳率:0%
帮助的人:32.6万
展开全部
一定要用指针的,指针是传递参数地址,也就是说你的swap函数交换的是你想要的两个值。如果不用指针是值传递,swap交换的是你要的两个值得副本,不是真交换。所以一定要用指针
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(9)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式