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
makearr
按8字节递增(如果地址大小为8)?我想他需要的是,(*arr)+i)
撤销指向int的指针,一旦指针指向int,它就会指向值??实际上,在这种情况下,因为它是一个int*
数组,我想我们都是正确的。对不起,选项2正是我想要实现的。通过重新定义do_something的显示方式,它可以对原始数组进行更改,对吗?那么回到调用do_something的函数中,应该会出现交换?谢谢,这正是我想要的!