交换两个指针指针

时间:2014-10-14 18:34:06

标签: c arrays pointers

我有一个函数,它接受一个指向数组的指针(所以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;
}

3 个答案:

答案 0 :(得分:4)

我不清楚arr是什么。它是int*的数组,还是指向int数组的指针?

选项1 arrint*的数组:

您的交换函数交换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指向数组的基址,因此取消引用它会使其与数组的基址相同,然后按ij递增会使其指向相应的元素。