结构体指针
一、结构体指针的定义与使用
当一个指针变量用来指向一个结构体变量时,称之为结构体指针变量。
结构体指针变量的值是所指向的结构体变量的起始地址。通过结构体指针即可访问该结构体变量,这与数组指针和函数指针的情况是相同的。
结构体指针变量定义的一般形式:
结构体名 *结构体指针变量名
当然也可以在定义结构体的同时定义这个结构体指针变量。
例如:(定义一个结构体(类型为自己定义的 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 是错误的。
引用结构体指针变量指向的结构体变量的成员的方法如下:
①、指针名->成员名
②、(*指针名).成员名
例如:(*p).score 与 p->score 是等价的。
【例 14】结构体指针运用举例
#include<cstdio>
using namespace std;
struct student{
char name[20];
char sex;
int score;
};
struct student s[3]={
{"xiaoming",'f',356},{"xiaoliang",'f',350},{"xiaohong",'m',0}};
int main()
{
student *p;
printf("Name sex score\n");
for(p=s;p<s+3;p++)
{
printf("%s %c %d\n",p->name,p->sex,p->score);
}
return 0;
}
【说明】这里 p++起到移动指针的作用,随着 p 的变化,输出数组不同元素内容。
不用指针:
#include<iostream>
using namespace std;
struct student{
char name[20];
char sex;
int score;
};
struct student s[3]={
{"xiaoming",'f',356},{"xiaoliang",'f',350},{"xiaohong",'m',0}};
int main()
{
printf("Name sex score\n");
for(int i=0;i<3;i++)
{
cout<<s[i].name<<" "<<s[i].sex<<" "<<s[i].score<<endl;
}
return 0;
}
二、自引用结构
在一个结构体内部包含一个类型为该结构体本身的成员是否合法呢?
struct stu{
char name[20];
int age,score;
stu p;
};
这种类型的自引用是非法的,因为成员 p 是另一个完整的结构,其内部还将包含它自己的成员 p。这第 2 个成员又是一个完整的结构,它还将包含自己的成员 p……这样重复下去就永无止境了。这有点像永远不会终止的递归程序。
但下面这个程序是合法的:
struct stu{
char name[20];
int age,score;
stu *p;
};
这个声明和前面那个声明的区别在于 p 现在是一个 指针而不是结构体。编译器在结构体的长度确定之前就已经知道指针的长度,所以这种类型的自引用是合法的。
当一个结构体中有一个或是多个成员是指针,它们所指向的类型就是本结构体类型时,通常这种结构体称为“引用自身的结构体”,即“自引用结构”。这种自引用结构是实现其他一些结构的基础。
自引用结构在动态数据结构中有重要作用,甚至可以说,自引用结构是 C/C++语言实现动态数据结构的基石。包括动态的链表、堆、栈、树,无不是自引用结构的具体实现。
例如,下面的定义就可以在实际操作中建立起一个链表。
struct node{
int x,y;
node *next;
}point;
还没有评论,来说两句吧...