# 结构体指针
## 定义一个结构体
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、结构体指针访问
**注1** :声明一个结构体指针记得初始化,一定要初始化,不初始化会出事(重要的事情说三遍)
**注2** :必须通过->符号来访问指针所指结构体的变量
(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;
}
## 结构体自引用
结构体的自引用,就是在结构体内部,包含指向自身类型结构体的指针。
**注**:结构体定义中可以嵌套其他结构体类型的变量,不可以嵌套自己这个类型的变量。
可以嵌套自己类型的指针。
### 一、没有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;