在这个调用中
swapArray(a,b);
参数表达式的类型为
int *
,而函数参数的类型为
int **
。从
int *
到
int **
没有隐式转换,因此编译器将发出诊断消息。
无论如何,当前实现的swap函数都没有意义。至少您的程序存在未定义行为,因为它试图交换指针而不是数组本身。
请注意,数组虽然不是指针,但在表达式中它们通常会被隐式转换为指向其第一个元素的指针,除非有罕见的例外。
要交换两个数组的元素,必须分别交换每对元素。并且您必须提供数组中的元素数量。否则,数组需要具有哨兵值。
下面是一个演示程序,展示了如何定义swap函数。
#include <stdio.h>
void printArr( const int a[], size_t n, const char *s )
{
printf( "%s:\t", s );
for ( size_t i = 0; i < n; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
}
void swapArray( int *a, int *b, size_t n )
{
for ( size_t i = 0; i < n; i++ )
{
int tmp = a[i];
a[i] = b[i];
b[i] = tmp;
}
}
int main(void)
{
enum { N = 4 };
int a[N] = { 1, 2, 3, 4 };
int b[N] = { 5, 6, 7, 8 };
printArr( a, N, "a" );
printArr( b, N, "b" );
putchar( '\n' );
swapArray( a, b, N );
printArr( a, N, "a" );
printArr( b, N, "b" );
putchar( '\n' );
return 0;
}
它的输出结果是
a: 1 2 3 4
b: 5 6 7 8
a: 5 6 7 8
b: 1 2 3 4
您可以使用指针交换原始数组的可视化表示。但在这种情况下,数组本身不会被交换。
考虑以下程序。
#include <stdio.h>
void printArr( const int a[], size_t n, const char *s )
{
printf( "%s:\t", s );
for ( size_t i = 0; i < n; i++ )
{
printf( "%d ", a[i] );
}
putchar( '\n' );
}
void swapArray( int **a, int **b )
{
int *tmp = *a;
*a = *b;
*b = tmp;
}
int main(void)
{
enum { N = 4 };
int a[N] = { 1, 2, 3, 4 };
int b[N] = { 5, 6, 7, 8 };
printArr( a, N, "a" );
printArr( b, N, "b" );
putchar( '\n' );
int *pa = a;
int *pb = b;
swapArray( &pa, &pb );
printArr( pa, N, "pa" );
printArr( pb, N, "pb" );
putchar( '\n' );
printArr( a, N, "a" );
printArr( b, N, "b" );
putchar( '\n' );
return 0;
}
它的输出结果是
a: 1 2 3 4
b: 5 6 7 8
pa: 5 6 7 8
pb: 1 2 3 4
a: 1 2 3 4
b: 5 6 7 8
正如您所看到的,数组并没有交换。但是指向数组第一个元素的指针已经交换了。使用这些指针,您可以模拟交换数组。
C++与C相反,有一个模板函数std::swap
用于数组,可以像这样简单地调用
std::swap( a, b );
swapArray
的调用(即使我很惊讶它能通过编译)。 - Paul R