c语言 函数调用 swap函数 一定要用指针吗
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()函数中却可以实现。可能是我有误区,希望各位大侠帮帮小弟。在线等。
谢谢大家的详细解答!都是我的老师啊!再次不盛感谢! 展开
不一定。
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没有交换。
对于你的交换函数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的值。
#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的内存自动回收器,呵呵,其实不一样。