由于***直接***转换为其他类型的void **
是无效的,因此此转换在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));
}
1条答案
按热度按时间tpgth1q71#
参数表达式的这些转换
对应的函数参数
前两个参数表达式的类型为
void **
,对应的函数参数的类型也为void **
。在这些声明中的函数内
类型为
void *
的表达式*av
和*bv
可以用作类型为int *
的指针a
和b
的初始化器,而无需显式转换,因为(C标准)1指向void的指针可以转换为指向任何对象类型的指针,也可以从指向任何对象类型的指针转换。指向任何对象类型的指针可以转换为指向void的指针,然后再转换回来;结果应与原始指针相等。
实际上这些声明
是多余的。
你可以不用它们就写作