交换指针不会改变指向的值。如果是这样,那就就像交换信封上的地址标签一样,让我进入你的房子,你进入我的房子。
你就快到了:
void swap(void *a, void *b, size_t size) {
char temp[size]; // C99, use malloc otherwise
// char serves as the type for "generic" byte arrays
memcpy(temp, b, size);
memcpy(b, a, size);
memcpy(a, temp, size);
}
The memcpy http://google.com/search?q=man+memcpy函数复制内存,这是 C 中对象的定义。(在 C++ 中称为 POD 或普通 ol' data,以进行比较。)通过这种方式,memcpy 是您在不关心对象类型的情况下进行赋值的方式,您可以甚至将其他分配写为 memcpy :
int a = 42, b = 3, temp;
temp = b;
b = a;
a = temp;
// same as:
memcpy(&temp, &b, sizeof a);
memcpy(&b, &a, sizeof a);
memcpy(&a, &temp, sizeof a);
这正是上面函数的作用,因为当您不知道对象的类型时不能使用赋值,而 void 是代表“未知”的类型。 (当用作函数返回类型时,它也意味着“无”。)
出于好奇,另一个版本在常见情况下避免了 malloc 并且不使用 C99 的 VLA:
void swap(void *a, void *b, size_t size) {
enum { threshold = 100 };
if (size <= threshold) {
char temp[threshold];
memcpy(temp, b, size);
memcpy(b, a, size);
memcpy(a, temp, size);
}
else {
void* temp = malloc(size);
assert(temp); // better error checking desired in non-example code
memcpy(temp, b, size);
memcpy(b, a, size);
memcpy(a, temp, size);
free(temp);
}
}