在交换函数中使用void指针

me4*_*e45 0 c swap pointers void

我有一个像这样的交换函数:

void swap(int i, int j, void* arr[])
{
    void *temp;
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
Run Code Online (Sandbox Code Playgroud)

我在主要调用swap这样:

main()
{
    int arr[8] = {4,7,9,2,6,7,8,1};
    void *ptr = arr;
    swap(0, 1, ptr);
    int k;
    for (k=0; k<8; k++)
        printf("%d ", arr[k]);
}
Run Code Online (Sandbox Code Playgroud)

现在,交换似乎工作正常,但不是将1值与另一个值交换,而是将另外2个值交换为2个值.例如,当我交换(0,1,ptr)时,我得到了数组

9,2,4,7,6,7,8,1
Run Code Online (Sandbox Code Playgroud)

当我应该得到:

7,4,9,2,6,7,8,1
Run Code Online (Sandbox Code Playgroud)

它不是交换4和7,而是用9,2交换4,7.它为什么这样做?

Jon*_*ood 5

swap()将数组视为指针数组,但传递的实际数组是类型数组int.显然,你的系统指针的大小是两个ints,因此每次交换一个"指针"时,它实际上都是交换两个整数.

你需要你的交换例程是这样的:

void swap(int i, int j, int arr[])
{
    int temp;
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
Run Code Online (Sandbox Code Playgroud)