我需要在函数中交换2个数组的值。问题是我可以改变主要的东西,只是功能本身。它应该重现2个整数数组,并交换它们。问题是,我不知道阵列的大小,而且对于我的介绍,它们甚至可以有不同的大小。试试这段代码:
int main()
{
int size = 4; //Please notice that I'm using this only to print the array
int a[] = {1,2,3,4};
int b[] = {5,6,7,8};
printArr(a,"a",size);
printArr(b,"b",size);
swapArray(a,b);
printf("Swapped:\n");
printArr(a,"a",size);
printArr(b,"b",size);
}
和这个功能:
void swapArray(int **a,int **b)
{
int *p = *a;
*a = *b;
*b = p;
}
而printArr只是打印数组:
void printArr(int arr[],char name[],int size)
{
printf("%s:\t",name);
for(int i=0;i<size;i++){
printf("%d\t",arr[i]);
}
printf("\n");
}
我得到了一个非常奇怪的结果:
a: 1 2 3 4
b: 5 6 7 8
Swapped:
a: 5 6 3 4
b: 1 2 7 8
我想了解它为什么会发生,而不仅仅是一个有效的解决方案。 谢谢:))
答案 0 :(得分:4)
我猜你的平台上指针的大小是64位,而输入的大小是32位。
调用swapArray
时,编译器会隐式地将int
数组重新解释为指针数组。 (这些是指向int
的指针,但这与此无关)。
swapArray
然后交换这些指针数组的第一个元素。
幸运的是,您的原始int
数组足够大,因此不会发生非法访问。
由于指针是64位,因此对应于两个被交换的int
。
答案 1 :(得分:3)
在此次电话会议中
swapArray(a,b);
参数表达式的类型为int *
,而函数参数的类型为int **
。没有从int *
类型到类型int **
的隐式转换。因此编译器应发出诊断消息。
在任何情况下,实现交换功能都没有意义。你的程序有未定义的行为,至少因为它试图交换指针而不是数组本身。
考虑到数组不是指针,尽管在表达式中有极少数例外,它们确实被隐式转换为指向第一个元素的指针。
要交换两个数组的元素,必须分开交换每对元素。 而且你必须提供数组中的元素数量。否则,数组需要有一个标记值。
这是一个演示程序,显示如何定义函数交换。
#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 );
答案 2 :(得分:3)
在C中,数组不是单一的&#34;&#34;你可以互换。您需要逐个元素地交换它。
唯一可以交换这些数组&#34;事物&#34;一次是因为它们是指向数组的指针。
int *a = malloc(n*sizeof(int));
int *b = malloc(n*sizeof(int));
int *tmp;
tmp=a; a=b; b=tmp;