1902zyt
# 结构体指针  

## 定义一个结构体

    struct My{
    My *left;
    My *right;
    int val;
    My(){}
    My(int val):left(NULL),right(NULL)  ,val(val){}
    };

### 1、一般结构体访问

    void test1(){
    My m;
    m.val = 1;
    cout<<m.val<<endl;
    }

### 2、结构体指针访问

&nbsp;

**注1** :声明一个结构体指针记得初始化,一定要初始化,不初始化会出事(重要的事情说三遍)

**注2** :必须通过->符号来访问指针所指结构体的变量

&nbsp;

(1)会报一个错:空指针访问异常,这是因为m这个指针还没有初始化,因此他没有内存空间,自然就不存在有val这个参数。

    void test3(){
    My *m;
    m->val = 1;
    }

(2)为正确打开方式

    void test3(){
    My *m;
    m = new My(3);
    m->val = 4;
    cout<<m->val<<endl;
    }

## 结构体自引用

结构体的自引用,就是在结构体内部,包含指向自身类型结构体的指针。

&nbsp;

**注**:结构体定义中可以嵌套其他结构体类型的变量,不可以嵌套自己这个类型的变量。

可以嵌套自己类型的指针。

### 一、没有typedef

错误情况:

    struct tag_1{
        struct tag_1 A;
        int value;

        //A是一个结构体,A的内部还会有一个结构体,以此下>去,无线循环。在内存分配的时候,由于无限的嵌套,无法确定结构体的长度,所>以时非法的。

        };

正确情况:

    struct tag_1
    {
        struct tsg_1 *A;
        int value;

        //由于指针的长度时确定的(在32位机器上指针长度是4),所以编译器能够确定该结构体的长度
        //这个指针看似指向自身,其实不是,而是执行同一类型的不同结构。
};

### 二、有typedef

错误情况:

    typedef struct{
        int value;
        NODE *link;
    }NODE;
    //使用typedef为结构体创建一个别名NODE。
    //但是是错误的,因为类型名的作用域是从语句结尾开始的,而在结构体内部是不>能使用的,因为还没有定义。

正确情况:

    (1)
    typedef struct tag_1
    {
        int value;
        struct tag_1 *link;
    }NODE;

    (2)
    typedef struct tag_1 NODE;
    struct tag_1
    {
        int value;
        NODE *link;
    };

    (3)
    struct tag_1
    {
        int value;
        struct tag_1 *link;
    };
    typedef struct tag_1 NODE;

分类:

技术点:

相关文章:

  • 2021-10-16
  • 2021-06-26
  • 2021-11-05
  • 2021-12-29
  • 2021-10-20
  • 2021-10-01
  • 2021-10-26
  • 2021-11-01
猜你喜欢
  • 2021-08-06
  • 2019-08-11
  • 2021-11-20
  • 2021-11-17
  • 2021-11-18
  • 2021-08-17
  • 2021-12-25
相关资源
相似解决方案