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

作者&投稿:韶范 (若有异议请与网页底部的电邮联系)
c语言中指针作为实参使用SWAP函数的问题。~

c语言中形参与实参的关系是:形参是实参的值副本。无论参数的类型是什么,传递到子函数中的形参只是实参的值。所以,在改变形参变量自身的值时,是与实参无关的。换句话说,形参的改变不会影响到实参。
但,如果参数类型是指针类型,则可以通过对指针变量所指向的地址中的数据进行修改,达到改变实参地址中的数据目的。
因此,使用SWAP函数进行数据交换时,必须保证两点:
参数必须是指针类型,指向待交换的数据
交换时,必须交换地址中的数据,而不是交换地址本身。
参考代码:
//错误的交换代码1void swap1( int a, int b ) //参数不是待交换数据的指针{ int t=a; a=b; b=t;}//错误的交换代码2void swap2( int *a, int *b ) { int *t=a;//交换形参变量本身 a=b; b=t;}//正确的交换代码void swap( int *a, int *b ) { int t=*a;//交换形参变量地址中的数据,指针变量不变 *a=*b; *b=t;}

首先说swap(int a,intb)与main函数调用的sawp(a,b),首先讨论变量的作用域,也就是变量的生存周期,main函数中的swap(a,b)中的a与b的作用域是整个main函数,而swap(int a,intb)中的a,b是swap的函数参数,作用域是swap函数,而main函数调用swap函数时会把main函数中的a与b的值传递给swap函数中的
a与b(所以把swap函数中的a与b称作是副本,因为他们本身的值就是main函数的a b复制过来的),这里两对a与b仅仅是值相等(在内存里地址是不同的),我们在swap函数中操作a,b让a与b交换,仅仅是让swap函数中的a b交换了,而a,b出了swap函数就不起作用了,不能实现main函数中的交换,因为这里用的是值传递的方式。
而要想让main函数中的a,b值交换怎么办呢?这就需要swap函数中的两点参数的内存地址与main函数中的相同。而C语言中存储地址的数据类型是指针,所以把swap函数中的参数换成指针就好了,也就是swap(int*a,int*b),这里的a,b都是指针变量,用来保存两个整型数字的内存地址,而main函数中需要调用swap函数把main函数的a,b的地址传过来,也就是swap(&a,&b)这里的&是取地址符,这样swap函数就得到了对应的两个地址,由于这样*a(这里的*代表解引用)与main函数中的a 具有了一样的地位,操作*a与main函数中操作a是一样的,因为内存地址是一样的,*b也一样。这样就可以完成在swap函数中交换*a与*b后,就实现了main函数中的a,b交换。

不一定。

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的值。

如果不用指针的话,调用swap函数时,那么形参和实参一点关系也没有的,传进去的参数是重新拷贝一份实参的值,函数对拷贝的值操作,一点也不影响实参。如果用指针的话,那么传进去的不是拷贝实参的值,而是一对对实参的引用,引用就意味着只要对引用操作其实根本是对实参的操作。swap(int *a,int *b) swap(int a,int b)是大不相同的,前者函数里所有的操作既是对实参操作,而后者根本不会影响到传进去的实参

第一个问题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的内存自动回收器,呵呵,其实不一样。

一定要用指针的,指针是传递参数地址,也就是说你的swap函数交换的是你想要的两个值。如果不用指针是值传递,swap交换的是你要的两个值得副本,不是真交换。所以一定要用指针


江源区15221615958: c语言 函数调用 swap函数 一定要用指针吗 -
锁爸龙血: 不一定. void swap(int a,int b) { int t; t=a; a=b; b=t; } 这样写,只是传了一份拷贝给a,b,交换好后,栈清空,没有传回给你原来所要交换的数.而printf放里面可以是因为你的那份拷贝(即a,b)的值是跟你要交换的数一样的,所以行得通. 不用...

江源区15221615958: 如何调用Swap()函数 -
锁爸龙血: 其实第一个函数: void Swap1(int x, int y) //参数 x,y为待交换的两个数 { int temp; temp = x; x = y; y = temp; }是无法完成两个数x,y的交换的,应为这是传值,形参x,y其实是实参a,b的一个备份,交换也只是交换了备份,所以无法交换a,b;但是可以做一下修改就可以了,传引用: void Swap1(int &x, int& y) //参数 x,y为待交换的两个数 { int temp; temp = x; x = y; y = temp; }这样形参和实参就是同一个空间,交换x,y也就是交换了a,b

江源区15221615958: 调用swap函数,将数组名array作为实参,传入给swap函数C语言输入两个值,保存到数组中,将. -
锁爸龙血: #1 void swap(int a[]);#2 swap(array);#3 temp=a[0];#4 a[0] = a[1];#5 a[1] = temp;

江源区15221615958: c语言怎样交换两个数组 用swap函数 -
锁爸龙血: void swap_array(int *pa,int *pb);main(){ int x[]={0,1,2,3,4}; int y[]={5,6,7,8,9}; swap_array(x,y); int i; for(i=0;i<5;i++) printf("%d",x[i]); printf("\r\n",x[i]); for(i=0;i<5;i++) printf("%d",y[i]); scanf("%d",&i); } void swap_array(int *pa,int *pb){ int n; n= ...

江源区15221615958: 用指针作形参,编写函数swap1,使主调函数中的两个变量交换值 -
锁爸龙血: void swap1(int* s1, int* s2) { int t = *s1; *s1 = *s2; *s2 = t; }

江源区15221615958: 在main函数中调用函数swap,将输入的两个整数按照从小到大的顺序输出.C语言填空. -
锁爸龙血: if(a>b) swap(p1,p2);

江源区15221615958: 编写一个交换函数swap(int *x,int *y),实现2个数的交换,并在主函数中调用,最后输 -
锁爸龙血: #include <stdio.h> void swap(int *x,int *y); int main(void) { int a,b; printf("a: "); scanf("%d",&a); printf("b: "); scanf("%d",&b); swap(&a,&b); printf("a=%d b=%d\n",a,b); return 0; } void swap(int *x,int *y) { int z=*x; *x=*y; *y=z; }

江源区15221615958: 下列程序调用swap函数交换a和b的值,并输出交换后的a和b的值 void main() { int a=3,b=5; swap( - ---); -
锁爸龙血: swap(int*p,int*q) { int t;t=*p;*p=*q;*q=t; }

江源区15221615958: 在C语言中,函数的形参与实参之间的值传递是什么意思?函数调用时如主函数中为swap(a,b),而从函数为 -
锁爸龙血: 以int 型举例 void Swap(int *a, int * b) {int temp = *a;*a = *b;*b = temp; } void Swap1(int a, int b) {int temp = a;a =b;b = temp;}Swap(int *, int *);称之为实参 实际传递的是 a和 b 的地址 啊 , 在调用a与b 的值(*a)使用的是原来的数 下面的 ...

江源区15221615958: 程序D15.c的功能是调用函数swap,将a和b的值交换,最后在屏幕上显示交换后的a,b之值. -
锁爸龙血: swap(*a, *b); 改为 swap(&a, &b); 函数改为 void swap(int *x, int *y) { int tmp; tmp = x; *x = *y; *y = tmp; }

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网