如何编辑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的正确版本会使它更清晰。
答案 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”a
和b
之间进行了互换。
答案 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);