As direct conversion to
void **
of other types is not valid is this conversion valid in C?
void swapValues(void **av, void **bv, size_t size)
{
int *a = *av;
int *b = *bv;
char array[size];
memcpy(array, a, size);
memcpy(a, b, size);
memcpy(b, array, size);
}
int main()
{
int i = 3;
int j = 5;
int *x = &i;
int *y = &j;
void *p = &i;
void *q = &j;
//this is invalid
swapValues(&x, &y, sizeof(i));
//is this valid
swapValues(&p, &q, sizeof(i));
}
参数表达式的这些转换
swapValues(&p, &q, sizeof(i));
对应函数参数
void swapValues(void **av, void **bv, size_t size)
是正确的。前两个参数表达式的类型为
void **
,对应的函数参数的类型为void **
.
在这些声明的函数中
int *a = *av;
int *b = *bv;
具有
*av
类型的表达式*bv
和void *
可以用作指针a
和b
类型int *
的初始值设定项而无需显式转换,因为(C标准)
1 指向 void 的指针可以转换为或从指向任何指针的指针转换 对象类型。指向任何对象类型的指针都可以转换为 指向 void 并再次返回的指针;结果应比较等于 原始指针。