gpt4 book ai didi

c - 为什么 (void **) 类型可以赋值给 (void *) 或 (int *)?

转载 作者:太空狗 更新时间:2023-10-29 16:43:49 24 4
gpt4 key购买 nike

这是我的 C 代码:

int main()
{
void * ptr_void;
void ** ptr_2void;
ptr_void = ptr_2void;
return 0;
}

我只是想知道为什么这段代码有效?我已将 (void *) 分配给 (void **),编译器会在没有警告的情况下传递它。类型看起来不匹配。以及以下将 (void **) 分配给 (int *) 的代码也有效。

int main()
{
int * ptr_int;
void ** ptr_2void;
ptr_int = ptr_2void;
return 0;
}

任何人都能够弄清楚 (void *) 到底是什么东西?

最佳答案

void 指针被类型转换为隐式指向任何其他数据类型的指针。编译器不会显示任何警告。类似地,从任何类型的指针到 void * 的类型转换也将在没有警告的情况下工作。

除了 void 指针,如果您尝试从一种指针类型隐式转换为另一种指针类型,编译器将发出警告。

例如考虑下面给出的代码,它会给你警告“assignment from incompatible pointer type”。

  int *intptr;
void *voidptr;
void **vvptr;
int intval=123;
voidptr=&intval;
vvptr=voidptr;
intptr=vvptr;

导致警告的代码行是 intptr=vvptr; 因为 intptr 是一个 integer pointervvptrvoid ** 类型的指针。它们都不是 void * 指针,因此是警告。

为了避免此警告,您必须显式地将 void ** 类型转换为 int * 类型。如果将 intptr=vvptr; 行更改为 intptr=(int *)vvptr;,则编译器将不会显示警告。

关于c - 为什么 (void **) 类型可以赋值给 (void *) 或 (int *)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20763224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com