这个转换在C中有效吗

问题描述 投票:0回答:1

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));  
}  
c language-lawyer implicit-conversion void-pointers
1个回答
0
投票

参数表达式的这些转换

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 并再次返回的指针;结果应比较等于 原始指针。

© www.soinside.com 2019 - 2024. All rights reserved.