c++ - 在 C++ 中取消引用指向结构的指针
问题描述
我是 C++ 新手,正在尝试弄清楚如何取消引用指向结构的指针,以便我可以检索该结构中成员的值。在 buildCar() 中,我希望能够打印汽车的年份以及汽车的规格(设置后,它将是指向另一个结构的指针)。我能够打印出存储 car1 结构的内存地址,但是我无法找出正确的语法来尊重这个指针。我尝试使用 (*) 进行取消引用,并使用 -> 而不是 . 引用结构的成员,但到目前为止还没有运气。任何帮助表示赞赏。谢谢!
struct item {
int id;
void *myData;
};
struct car {
unsigned int year;
char* specs;
};
void buildCar(item item1);
int main() {
struct item item1;
item1.id = 1;
struct car car1;
car1.year = 2019;
item1.myData = &car1;
buildCar(item1);
}
void buildCar(item item1){
cout << "address of car1 = " << item1.myData;
}
解决方案
我无法找出用于尊重此指针的正确语法。
您不能间接通过 void 指针。您只能通过非空指针间接。
解决方案:更改指针的类型:
struct item {
int id;
struct car *myData;
};
然后,您可以使用间接成员访问运算符访问指向对象的成员->
。
据推测,除了汽车之外,可能还有其他类型的物品,因此可能需要使用 void *。
在纯 C++ 中,有更好的替代方案,例如继承std::variant
和std::any
,具体取决于使用要求。
鉴于 Mango 在评论中提到标头是 C,更好的替代品可能不可用,并且void*
可能确实是必要的。
在这种情况下,可以将 void 指针转换回使用 void 指针转换而来的原始指针类型static_cast
。转换为错误类型的行为将是未定义的,因此必须非常小心。
推荐阅读
- twitter-bootstrap - Bootstrap 导航选项卡不适用于动态内容
- google-apps-script - 工作表仅在手动运行时按 Apps 脚本函数排序
- java - 停止 Eclipse 缩进使用 Ctrl-/ 创建的注释
- javascript - javascript承诺作为参数传递的所有值数组
- java - Java 并非所有 jar 都由相同的证书签名 - 这是不同的
- php - PHP Laravel - 字段列表中的未知列
- python - 我无法导入pyaudio?
- c# - 获取adobe reader打开的文件路径
- java - Java Generics super/extends - 不同的行为(用于 OCP java 8 学习目的)
- mysql - 使用 mySQL 和 Mongodb 插入节点循环