c语言中指针作为实参使用SWAP函数的问题。

#include<stdio.h>

void swap(int*a,int*b)
{
int*t;
t=a;a=b;b=t;
}
main()
{
int i=3,j=5,*p=&i,*q=&j;
swap(p,q);
printf("%d %d\n",*p,*q);
}
输出结果为什么是3 5,而不是交换后的5 3?
在swap函数中指针a、b的地址发生了互换,即指针p、q的地址也发生了互换,最后输出*p和*q应该分别是j和i(5 3)才对啊…

c语言中形参与实参的关系是:形参是实参的值副本。无论参数的类型是什么,传递到子函数中的形参只是实参的值。所以,在改变形参变量自身的值时,是与实参无关的。换句话说,形参的改变不会影响到实参。

但,如果参数类型是指针类型,则可以通过对指针变量所指向的地址中的数据进行修改,达到改变实参地址中的数据目的。

因此,使用SWAP函数进行数据交换时,必须保证两点:

    参数必须是指针类型,指向待交换的数据

    交换时,必须交换地址中的数据,而不是交换地址本身。

参考代码:

//错误的交换代码1
void swap1( int a, int b ) //参数不是待交换数据的指针
{
    int t=a;
    a=b;
    b=t;
}
//错误的交换代码2
void 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;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-09-17
void swap(int*a,int*b)
{
int*t;
t=a;a=b;b=t; //这里交换的是指针a,b的副本,不影响指针指向的值
}
改为

void swap(int*a,int*b)
{
int t;
t=*a;*a=*b;*b=t; //这里交换的是值
}
第2个回答  推荐于2017-09-04
你还没了解值传递和地址传递的本质啊。
首先 p ---> i q ----> j (p和q分别存放i和j的地址)你调用swap函数。
就会把实参的值复制一份给形参。也就是说a ----> i b ---->j。现在你在swap里面使用t指针交换了
a和b,也就是a ---> j b---->i,也就是说你交换的是指针的值!但是你想想主函数main当中p和q交换了吗??你只是复制了一份值给形参,自己本身没改变。你可以这样实验一下:
在swap函数中输出看一下:printf("a:%d\tb:%d\n",*a,*b); //你可以看一下结果是交换了的。不过随着swap函数的结束而释放了a,b的空间,然后回到main函数p和q的值还是原来的。追问

你的意思是swap的形参a、b不能影响实参p、q的意思吗?

追答

你要抓住形参的值只是实参的一个副本,你改变其本身是不能实现交换的!

如果你是这样int t; t = *a; *a = *b; *b = t;你交换的就是地址所对应的值也就是i和j的值。
此时指针a和p指向的还是i的地址,只不过i地址里面存放的是j的值了。j同理!

本回答被提问者和网友采纳
第3个回答  2012-09-17
你的这个swap中指针参数 *a,*b 已经退化成普通的局部参数了,也就是说a和b同样也只是形参而已,只不过披了个指针的外衣,在函数体内交换的只是这两个指针本身的拷贝,而不是它们指向的内容,因此需要用解除指针的方式来交换它们指向的内容。其实这里提供指针做参数,只是为了让你有办法去访问它们的实际指向内容(实参),指针本身(形参)的交换没有任何意义。有两种改法:
1.
void swap(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
2.
void swap(int &a,int &b)
{
int t = a;
a = b;
b = t;
}
swap(i,j);