我不得不通过引用调用来交换数组元素以减少我更大项目中的代码行,我成功地交换了它们但是这段代码给出了一堆警告,我该如何有效地做到这一点?
#include <stdio.h>
void swap(int *arr, int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
int main(void)
{
int a[5] = {2, 4, 6, 2, 3};
swap(&a, 1, 2);
for (int i = 0; i < 5; i++)
{
printf("%d", a[i]);
}
return 0;
}
输出=>
swap_array.c: In function 'main':
swap_array.c:11:10: warning: passing argument 1 of 'swap' from incompatible pointer type [-Wincompatible-pointer-types]
11 | swap(&a, 1, 2);
| ^~
| |
| int (*)[5]
swap_array.c:2:16: note: expected 'int *' but argument is of type 'int (*)[5]'
2 | void swap(int *arr, int i, int j)
| ~~~~~^~~
26423
你有一个额外的
&
操作员,只需删除它。
swap(a, 1, 2);
数组,就像您的
a
变量一样,衰减为 C 中的指针,因此当您执行 &a
时,您正在创建一个双指针,您的函数不接受它。
您可以在这里阅读更多关于指针衰减的信息。
数组名默认是指针。数组的名称指向数组的第一个元素。
当你将数组传递给函数时,它们总是通过引用传递。无需在数组名称前使用取消引用运算符
&
。
也就是说,函数调用应该是这样的:
swap(a, 1, 2);
代替:
swap(&a, 1, 2);
你声明了一个数组类型的对象
int [5]
int a[5] = {2, 4, 6, 2, 3};
所以表达式
&a
的指针类型为int ( * )[5]
。但是该函数需要类型为int *
的第一个参数
void swap(int *arr, int i, int j)
没有从类型
int ( * )[5]
到类型int *
的隐式转换。所以编译器发出错误信息。
相反,您需要像这样调用函数
swap(a, 1, 2);
在这种情况下,数组指示符
a
被隐式转换为指向类型 int *
的第一个元素的指针,并且使用指针算法,您可以使用索引 1
和 2
访问数组的元素。
但是最好只用两个参数声明和定义函数,如下所示
void swap( int *px, int *py )
{
int temp = *px
*px = *py;
*py = temp;
}
并像这样调用函数
swap( a + 1, a + 2 );
在 C 中,按引用传递意味着通过指向对象的指针间接传递对象。因此取消引用指针,您可以直接访问指针指向的对象。