组别:普及组
难度:4
一、结构体指针的定义与使用 当一个指针变量用来指向一个结构体变量时,称之为结构体指针变量。 结构体指针变量的值是所指向的结构体变量的起始地址。通过结构体指针即可访问该结构体变量,这与数组指针和函数指针的情况是相同的。 结构体指针变量定义的一般形式:
结构体名 *结构体指针变量名
当然也可以在定义结构体的同时定义这个结构体指针变量。
例如:(定义一个结构体(类型为自己定义的 student)指针变量 p)
struct student{
char name[20];
char sex;
float score;
} *p;
也可写成
struct student {
char name[20];
char sex;
float score;
};
student *p;
与前面讨论的各类指针变量相同,结构体指针变量也必须要赋值后才能使用。赋值是把结构体变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。
例如:如果 p 是被定义为 student 类型的结构体指针变量,boy 是被定义为 student 类型的结构体变量,则:p=&boy 是正确的,而 p=&student 是错误的。
引用结构体指针变量指向的结构体变量的成员的方法如下:
指针名->成员名
(*指针名).成员名
例一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include<iostream> using namespace std; struct student //定义一个学生的结构体 { int age; bool sex; string name; }; int main() { student li={12,true,"lisi"}; //定义一个结构体变量 student *p; //定义一个结构体指针 p=&li; //将结构体变量传给指针 cout<<li.age<<' '<<li.sex<<' '<<li.name<<endl; //结构体变量访问结构体成员 cout<<p->age<<' '<<p->sex<<' '<<p->name<<endl; //结构体指针访问结构体成员 cout<<(*p).age<<' '<<(*p).sex<<' '<<(*p).name<<endl; //结构体指针访问结构体成员 return 0; } |
例二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include<iostream> using namespace std; struct student{ char name[20]; char sex; int score; } s[3]={{"zhangsan",'m',356}, {"lisi",'m',350}, {"wangxiaoya",'f',370} }; //定义结构体student,并初始化结构体数组 int main(){ student *p; p=s; for (int i = 0; i < 3; i++){ //通过结构体指针访问结构体数组 cout<<p->name<<' '<<p->sex<<' '<<p->score<<endl; p++; } return 0; } |
自引用结构
自引用结构(Self-Referential Structure)是一种特殊的结构。主要特征:一个或多个自身的变量是指向自身的指针。
struct selfRef{ int a; struct selfRef b; int c; }
这个结构是非法的,为什么呢?结构里面有包含B,B里面有包含自己的成员B,这样就会无休止的循环下去。
struct selfRef{ int a; struct selfRef *b; int c; }
这个结构是合法的,因为p是指针,编译器在结构的长度确定之前,就已经知道指针的长度,所以这样自引用是合法的。
自引用结构在动态数据结构中有重要的作用,在链表、堆、栈、树等实现中都会用到自引用体。