指针与结构体

组别:普及组
难度: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是指针,编译器在结构的长度确定之前,就已经知道指针的长度,所以这样自引用是合法的。

自引用结构在动态数据结构中有重要的作用,在链表、堆、栈、树等实现中都会用到自引用体。

Scroll to Top