如果您想更改函数中的原始对象,则必须通过引用将它们传递给函数。
在 C 中,通过引用传递对象意味着通过指向原始对象的指针间接传递它们。
否则,如果您将原始对象本身传递给函数,该函数将处理对象的副本。显然,更改副本不会影响原始对象。
这正是这个函数中发生的事情
void swap(int *a,int *b){
int *p=b;
b=a;
a=p;
}
该函数处理作为此调用中的参数传递给函数的指针的副本
swap(&a,&b);
也就是说,该函数确实交换了声明为其参数的两个指针的值。但它们不是传递给函数的原始指针。它们是指针的副本。所以原来的指针的值没有改变
函数交换一般可以如下所示
void swap( T *a, T *b )
{
T tmp = *a;
*a = *b;
*b = tmp;
}
where T
是相同的类型说明符。
所以如果你想交换该类型的对象int
然后在上面的函数中T
将int
该函数看起来像
void swap( int *a, int *b )
{
int tmp = *a;
*a = *b;
*b = tmp;
}
如果你想交换类型指针的值int *
then T
将int *
该函数看起来像
void swap( int **a, int **b )
{
int *tmp = *a;
*a = *b;
*b = tmp;
}
这是一个演示程序。
#include <stdio.h>
void swap1( int *pa, int *pb )
{
int tmp = *pa;
*pa = *pb;
*pb = tmp;
}
void swap2( int **ppa, int **ppb )
{
int *tmp = *ppa;
*ppa = *ppb;
*ppb = tmp;
}
int main(void)
{
int a = 3, b = 5;
swap1( &a, &b );
printf( "a = %d b = %d\n", a, b );
// reset again the values of the variables
a = 3; b = 5;
int *pa = &a, *pb = &b;
swap2( &pa, &pb );
printf( "*pa = %d *pb = %d\n", *pa, *pb );
return 0;
}
它的输出是
a = 5 b = 3
*pa = 5 *pb = 3
首先在程序中存在两个类型的对象int
被交换,所以想象的类型说明符T
is int
.
然后是两个指向对象的指针a
and b
被交换。所以想象的类型说明符T
int *
.
交换指针后pa
现在指向该对象b
和指针pb
现在指向该对象a
.