结构体嵌套空指针,空指针强制转其它类型并访问成员变量

#include <iostream>
using namespace std;
struct test1 {
    void * a1;
};

struct test2
{
    int a2 = 10;
    int a3 = 20;
};

int main() {
    //结构体和结构体成员变量中的指针需要分别初始化
    test1 h1; //初始化结构体test1
    h1.a1 = new test2; //初始化空指针a1分配内存的大小为结构体test2所占字节
    //此时h1.a1是一个内存空间大小与结构体test2的内存大小一样的空指针。
    //空指针h1.a1虽然其内存大小和结构体test2一样,但是没有办法调用test2中的成员变量
    //只能将空指针h1.a1强制转换成结构体test2类型的指针并初始化新的结构体test2类型的指针h2
    test2 *h2 = (test2 *) h1.a1; //将空指针h1.a1强转为test2类型的指针
    //因为h2指针和h1.a1的指针的地址一样,所以可以通过修改h2的成员变量达到修改h1.a1的目的。
    cout << "修改之前" << endl;
    cout << "h22" << h2->a2 << endl;
    cout << "h23" << h2->a3 << endl;
    h2->a2 = 30; //此时修改h2中成员变量的值就是在修改test2类型的指针h1.a1的值
    h2->a3 = 40; 
    //因为没有办法直接使用 h1.a1->a2的方式访问成员变量,
    //所以仍然需要初始化h3,并强制转换h1.a1为结构test2类型的指针才可以访问成员变量。
    test2 *h3 = (test2 *) h1.a1;
    cout << "修改之后" << endl;
    cout << "h32" << h3->a2 << endl;
    cout << "h33" << h3->a3 << endl;
    return 0;
}

总结:


1. 结构体变量的成员中包含指针类型的成员变量,需要分别初始化结构体以及指针类型的成员变量。
2. 空指针void1 通过new 类型A 的赋值方式初始化,只是把类型A 的内存分配给了空指针void1,此时空指针void1的指针类型仍然是空指针,并且该空指针不能够访问 类型A的成员变量。
3. 空指针void1 的指针类型是空指针,内存是类型A的大小,可以通过将空指针强制转换为类型A 并赋值给 类型A 的指针变量B的方式访问成员并且可以通过修改指针变量B的成员变量 间接的修改 空指针void1的成员变量。
4. 访问指针的成员 必须指针类型 以及 内存大小全部一致才可以。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值