C 将两个指针交换为指针

C 将两个指针交换为指针,c,arrays,pointers,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

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

只需删除
&
符号即可。已使用指针访问数组元素

当你说

arr[i] 
你实际上是在说

*(arr + i)
因此,您已经在传递一个指向
do\u something
的指针


由于
arr
包含指向整数(
int*
)的指针,然后说
arr[i]
您正在访问位于第i个位置的
int*
,因此您可以将其传递到接受
int*

的swap方法中,我不清楚
arr
是什么。它是一个
int*
数组,还是指向
int
数组的指针

选项1
arr
int*
的数组:

交换函数交换
int
变量,但需要交换
int*
变量。因此,在swap函数中需要额外级别的间接寻址

void swap(int** a, int** b) 
{
    int* temp = *a;
    *a = *b;
    *b = temp;
}

选项2
arr
是指向
int
数组的指针:

在本例中,您希望交换两个
int
值,而问题中出现的
swap
变量正是这样做的。问题是您定义的
do\u something
不正确。它应该接收一个
int*
,并按如下方式实现:

void do_something(int* arr, int i, int j) 
{
    swap(&arr[i], &arr[j]);
}
线路

swap(&arr[i], &arr[j]);
应该是

swap( ((*arr) + i), ((*arr) + j) );

由于
arr
指向数组的基址,因此取消对它的引用使其与数组的基址相同,然后通过
i
j
递增将使其指向相应的元素

只需删除
&
符号您需要在
dou\u something
中取消对指针的引用。为了将来参考,术语“双指针”可能会被误解为:
double*a。不过,另一方面,说“指向整数的指针”有点罗嗦。实际上,我在早些时候用谷歌搜索时遇到了这个问题。谢谢你指出这一点,这可能会让人困惑。@Serge:我已经更新了标题
arr
是指向int的指针。是否会做
arr+1
make
arr
8字节递增(如果地址大小为8)?我想他需要的是,
(*arr)+i)
撤销指向int的指针,一旦指针指向int,它就会指向值??实际上,在这种情况下,因为它是一个
int*
数组,我想我们都是正确的。对不起,选项2正是我想要实现的。通过重新定义do_something的显示方式,它可以对原始数组进行更改,对吗?那么回到调用do_something的函数中,应该会出现交换?谢谢,这正是我想要的!