如何编辑void类型数组

时间:2013-11-17 14:50:17

标签: c arrays void-pointers

如何编辑void指针?显然,这在C中是可能的,因为有许多标准库函数可以做到这一点。

我以为我实现了一个交换两个数组元素的函数(我知道它有一个标准函数,它只是一个练习),所以理想情况下我想这样做:

void swap(void *arr, int a, int b, int elSize) {
    void arrEl = arr[a];
    arr[a] = arr[b];
    arr[b] = arrEl;
}

当然,我不能取消引用void指针,也不能有void类型的变量,所以我必须以某种方式解决这个问题,但我发现我不知道如何编辑void type array。
那么我应该如何实现上面的伪C?

我看到了this thread,但我不知道如何应用它,并认为看到上面的伪C的正确版本会使它更清晰。

3 个答案:

答案 0 :(得分:1)

从技术上讲,您不能拥有void数组或void值。你可以有一个指向某种类型数组的void指针。

要使用它,你必须将其强制转换为非空指针,例如

int value0 = ((int *) arr)[0];

最简单的解决方案就是将指针arr声明为指向它实际类型的指针。

如果你不能这样做,那么如果你有元素大小,你可以声明临时可变长度数组来处理交换,比如

char tmp[elSize];

memcpy(tmp, (char *) arr + elSize * a, elSize);
memcpy((char *) arr + elSize * a, (char *) arr + elSize * b, elSize);
memcpy((char *) arr + elSize * b, tmp, elSize);

上述内容在“index”ab之间进行了互换。

答案 1 :(得分:1)

Joachim有点快,但无论如何我都会添加我的答案。

#include <string.h>

void swap(void *arr, size_t a, size_t b, size_t elSize) {
    char temp[elSize];

    memcpy(temp, (char*)arr+a*elSize, elSize);
    memcpy((char*)arr+a*elSize, (char*)arr+b*elSize, elSize);
    memcpy((char*)arr+b*elSize, temp, elSize);
}

#include <stdio.h>
int main(void)
{

int array[3] = {1,13,42};

char text[] = "This is text\n" ;

swap(text, 0, 2, 4);

printf("%s", text );

swap(array, 0, 2, sizeof array[0] );

printf("{%d %d %d}\n", array[0], array[1], array[2] );

return 0;
}

答案 2 :(得分:0)

通过将arr[a]分配给arrEl,实际上您正在取消引用void类型指针。为此,你必须在对它进行任何操作之前进行投射。如;

int arrEl = ((int *)arr)[a];  

int arrEl = *((int *)arr + a);