Void ** 泛型指针
Void ** a generic pointer?
void *
是一个通用指针,但是void **
呢?void **
也是通用指针吗?
我们可以将void **
类型转换为int **
、char **
等吗?
我将不胜感激堆栈溢出家庭对此的任何信息。
No. void**
是指向void*
的指针,没有别的。只有void*
充当通用指针。
请注意,实际尝试它可能会产生一致的结果,但只有上述是标准规定的,其他任何内容都是未定义的行为,可能会毫不留情地崩溃。
>void**
是指向void*
的指针。 除了它是未定义的行为(虽然很可怕,但该行为通常由编译器定义(,如果您reinterpret_cast
执行以下操作,这也是一个巨大的问题:
int x = 3;
char c = 2;
int* y = &x;
void* c_v = &c; // perfectly safe and well defined
void** z = reinterpret_cast<void**>(&y); // danger danger will robinson
*z = c_v; // note, no cast on this line
*y = 2; // undefined behavior, probably trashes the stack
指针到指针与指针是非常不同的野兽。 在指针上相对安全的类型更改在指向指针的指针上不安全。
无效**通用指针?
void **
不是通用指针。标准只说void *
是一个通用指针。
第22章 指针指向指针
关于指针到指针和内存分配的一个方面:尽管
malloc
返回的void *
类型是一个泛型指针,适合分配给任何类型的指针或从任何类型的指针赋值,但假设的类型void **
不是指向指针的泛型指针。
我们可以将
void **
类型转换为int **
、char **
等吗?
不。你不应该。
C-FAQ说:
C 中没有通用的指针到指针类型。
void *
充当通用指针,因为当将其他指针类型分配给void *
时会自动应用转换(如有必要(;如果尝试间接化指向void *
以外的指针类型的void **
值,则无法执行这些转换。当您使用void **
指针值时(例如,当您使用*
运算符访问void **
指向的void *
值时(,编译器无法知道该void *
值是否曾经是从其他指针类型转换而来的。它必须假设它只不过是一个void *
;它不能执行任何隐式转换。换句话说,你玩的任何
void **
值都必须是某个地方的实际void *
值的地址;像(void **)&dp
这样的强制转换,虽然它们可能会关闭编译器,但却是不可移植的(甚至可能不做你想要的;另见问题13.9(。如果void **
指向的指针不是void *
,并且它的大小或表示形式与void *
不同,则编译器将无法正确访问它。
自由地扩展语言,允许在存在合适的转换运算符的情况下将void**
用作指向任何事物的通用指针类型,并且在标准实现之前的日子里,实际上可以这样做。 该标准没有强制要求这种处理,因为有些平台无法有效地适应这种使用。 据推测,作者认为,要求需要使代码在此类平台上工作的程序员跳过箍来解决缺少"指向任何数据指针的指针"类型的问题,比要求实现跳过箍以适应此类结构而不考虑他们的客户是否会使用它们的危害要小。 这种判断并不意味着该标准的作者打算要求程序员跳过这些障碍,即使在编写永远不会被要求在此类平台上运行的代码时也是如此。 Clang和gcc可以通过-fno-strict-aliasing
选项配置为支持此类构造。
- 是否可以在C++中创建泛型函数指针?
- 对列表类中的泛型方法禁用编译器警告 2100,该泛型方法可能包含指针,也可能不包含指针
- 泛型方法指针.reinterpret_cast指向不同类的方法指针,这是 UB 吗?
- 仅当泛型类型的值是指针时,才删除该值
- Boost:当缺少类型时,如何通过基指针序列化/反序列化泛型类型集合
- 指向类成员函数的泛型函数指针
- 返回泛型函数中对象的引用(具有指针或非指针属性)
- 将类型作为指向另一个类的对象的指针的泛型类-NOT WORKING
- 使用基类的泛型方法指针调用派生类的方法
- 如何创建泛型函数,该函数将返回c++中任何级别指针的值
- C++限制泛型(和指针问题)中的类型
- 显示泛型指针中的值
- 从一个基类的指针对另一个基类的多重继承和泛型访问
- 多态树类中的双指针upcast(再次)、shared_ptr和泛型setChild函数
- 用泛型类指针作为参数声明函数指针的正确语法是什么
- 包装函数指针和函数对象在泛型代码中是如何工作的
- C#指针、迭代器和泛型
- 为返回指向函数的指针的泛型函数指定类
- 创建泛型链表,将下一个指针放在结构的开头
- 如何在c++中使用void指针(泛型)访问类成员