我有一个函数,它接受一个指向数组的指针(所以int**
)。在这个函数中,我想调用swap(int*, int*)
来交换数组中两个元素的位置。 C中用于交换这两个元素的语法是什么?
以下是我正在寻找的一个例子:
int* do_something(int** arr) {
// assume i and j are valid locations in the array
swap(&arr[i], &arr[j]); // what should this line be?
}
// this function works fine, no changes needed
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
答案 0 :(得分:4)
我不清楚arr
是什么。它是int*
的数组,还是指向int
数组的指针?
选项1 :arr
是int*
的数组:
您的交换函数交换int
个变量,但您需要交换int*
个变量。因此,在交换函数中需要额外的间接级别。
void swap(int** a, int** b)
{
int* temp = *a;
*a = *b;
*b = temp;
}
选项2 :arr
是指向int
数组的指针:
在这种情况下,您希望交换两个int
值,而问题中出现的swap
变体就是这样。问题是您错误地定义了do_something
。它应该收到int*
并按照以下方式实施:
void do_something(int* arr, int i, int j)
{
swap(&arr[i], &arr[j]);
}
答案 1 :(得分:0)
只需删除&
个符号即可。已经使用指针访问了数组元素。
当你说
时arr[i]
你实际上在说
*(arr + i)
所以你已经将指针传递给do_something
。
由于arr
包含指向整数的指针(int*
),然后说arr[i]
您正在访问第i个位置的int*
,因此您可以将其传递给您接受int *
答案 2 :(得分:0)
该行
swap(&arr[i], &arr[j]);
应该是
swap( ((*arr) + i), ((*arr) + j) );
由于arr
指向数组的基址,因此取消引用它会使其与数组的基址相同,然后按i
或j
递增会使其指向相应的元素。