这个转换在C中有效吗

uqdfh47h  于 2023-03-28  发布在  其他
关注(0)|答案(1)|浏览(106)

由于***直接***转换为其他类型的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));  
}
tpgth1q7

tpgth1q71#

参数表达式的这些转换

swapValues(&p, &q, sizeof(i));

对应的函数参数

void swapValues(void **av, void **bv, size_t size)

前两个参数表达式的类型为void **,对应的函数参数的类型也为void **
在这些声明中的函数内

int *a = *av;
int *b = *bv;

类型为void *的表达式*av*bv可以用作类型为int *的指针ab的初始化器,而无需显式转换,因为(C标准)
1指向void的指针可以转换为指向任何对象类型的指针,也可以从指向任何对象类型的指针转换。指向任何对象类型的指针可以转换为指向void的指针,然后再转换回来;结果应与原始指针相等。
实际上这些声明

int *a = *av;
int *b = *bv;

是多余的。
你可以不用它们就写作

char array[size];  
memcpy(array, *av, size);  
memcpy(*av, *bv, size);  
memcpy(*bv, array, size);

相关问题