C语言结构体指针如何定义和使用?(非常详细)
一个指向结构体变量的指针,指向的是结构体变量的起始地址。除此以外,指针变量还可以指向结构体数组以及数组中的元素。
例如,定义一个指向 struct Student 结构类型的 pStruct 指针变量,代码如下:
指针指向的是结构体变量的地址,因此可以使用指针来访问结构体中的成员,方式有两种。
例如,pStruct 指针指向 student1 结构体变量,可以采用如下方式引用其中的成员。
【实例】某公司招聘新员工后,需要为其安排工位和所属部门。利用结构体类型指针编写程序,将所有新员工的信息输出。
运行程序,结果为:
例如,使用指向运算符引用一个变量的成员:
总结一下,假如 student 为结构体变量,pStruct 为指向结构体变量的指针,则以下 3 种引用形式的效果是完全等价的:
【实例】打印购票信息。在本实例中,定义结构体变量但不对其进行初始化操作,使用指针指向结构体变量并为其成员进行赋值操作。
运行程序,结果为:
例如,定义一个结构体数组 student[5],使用结构体指针指向该数组,代码如下:
如果想利用指针指向第 3 个元素,则在数组名后附加下标,然后在数组名前使用取地址符号“&”:
【实例】显示 5 名同学信息。在本实例中,使用之前声明的学生结构类型定义结构体数组,并对其进行初始化操作。通过指向该数组的指针,将其中元素的数据进行输出显示。
运行程序,结果为:
C语言指向结构体变量的指针
定义结构体指针的一般形式如下:结构体类型 *指针名;
例如,定义一个指向 struct Student 结构类型的 pStruct 指针变量,代码如下:
struct Student *pStruct;
指针指向的是结构体变量的地址,因此可以使用指针来访问结构体中的成员,方式有两种。
1) 用成员运算符“.”引用结构成员
语法格式为为:(*pStruct).成员名;
例如,pStruct 指针指向 student1 结构体变量,可以采用如下方式引用其中的成员。
(*pStruct).iNumber=12061212;注意,*pStruct 一定放在括号内,这是因为成员运算符“.”的优先级最高,如果不使用括号,就会先执行“.”运算然后才是“*”运算。
【实例】某公司招聘新员工后,需要为其安排工位和所属部门。利用结构体类型指针编写程序,将所有新员工的信息输出。
#include<stdio.h> /*包含头文件*/ struct People /*定义人员结构体*/ { char cName[20]; /*姓名*/ int iNumber; /*职位号*/ char cS[20]; /*部门*/ }people={"张伟",14,"开发部"}; /*对结构体变量初始化*/ int main() { struct People* pStruct; /*定义结构体类型指针*/ pStruct=&people; /*指针指向结构体变量*/ printf("-----信息如下-----\n"); /*提示信息*/ printf("姓名: %s\n",(*pStruct).cName); /*使用指针输出结构体成员*/ printf("职工号: %d\n",(*pStruct).iNumber); printf("部门: %s\n",(*pStruct).cS); return 0;/*程序结束*/ }程序中:
- 首先声明结构体类型 People,同时定义变量 people 并进行初始化。
- 定义结构体指针变量 pStruct,然后执行“pStruct=&people;”使指针指向 people 变量。
- 输出消息提示,然后在 printf() 函数中使用指针引用成员变量,将员工信息
运行程序,结果为:
----信息如下----- 姓名: 张伟 职工号: 14 部门: 开发部
2) 用指向运算符“->”引用结构成员
语法格式为:pStruct->成员名;
例如,使用指向运算符引用一个变量的成员:
pStruct->iNumber=12061212;注意,在使用“->”引用成员时,要注意分析以下情况:
- pStruct->iGrade:表示指向的结构体变量中成员 iGrade 的值。
- pStruct->iGrade++:表示指向的结构体变量中成员 iGrade 的值,使用后该值加 1。
- ++pStruct->iGrade:表示指向的结构体变量中成员 iGrade 的值加 1,计算后再进行使用。
总结一下,假如 student 为结构体变量,pStruct 为指向结构体变量的指针,则以下 3 种引用形式的效果是完全等价的:
student.成员名; (*pStruct).成员名; pStruct->成员名;
【实例】打印购票信息。在本实例中,定义结构体变量但不对其进行初始化操作,使用指针指向结构体变量并为其成员进行赋值操作。
#include<stdio.h> #include<string.h> struct Ticket /*定义车票结构体*/ { char cName[20]; /*姓名*/ int iNumber; /*票价*/ char S[20]; /*乘车区间*/ char cAddress[20]; /*车次*/ char c[20]; /*开车时间*/ }ticket; int main() { struct Ticket* pStruct; /*定义结构体变量*/ pStruct=&ticket; /*指针指向结构体变量*/ strcpy(pStruct->cName,"张伟"); /*赋值*/ pStruct->iNumber=285; strcpy(pStruct->S,"长春-北京"); strcpy(pStruct->cAddress,"D71"); strcpy(pStruct->c,"2021 年 2 月 20 日 09:08 开"); printf("姓名: %s\n",ticket.cName); /*输出结构体成员*/ printf("票价: %d 元\n",ticket.iNumber); printf("乘车区间: %s\n",ticket.S); printf("车次: %s\n",ticket.cAddress); printf("开车时间: %s\n",ticket.c); return 0; }程序中:
-
使用 strcpy() 函数将一个字符串常量复制到成员变量中。使用 strcpy() 函数前,要在程序中包含头文件
<string.h>
; - 为成员赋值时,使用的是“->”运算符引用的成员变量,在程序的最后使用结构体变量和“.”运算符直接将成员的数据进行输出。
运行程序,结果为:
姓名: 张伟 票价: 285 元 乘车区间: 长春-北京 车次: D71 开车时间: 2021 年 2 月 20 日 09:08 开
C语言指向结构体数组的指针
结构体指针变量指向结构体数组时,指针变量的值就是结构体数组的首地址。还可以直接指向结构体数组中的元素,这时指针变量的值就是该结构体数组元素的首地址。例如,定义一个结构体数组 student[5],使用结构体指针指向该数组,代码如下:
struct Student* pStruct; pStruct=student;因为数组不使用下标时表示的是数组的第一个元素的地址,所以指针指向数组的首地址。
如果想利用指针指向第 3 个元素,则在数组名后附加下标,然后在数组名前使用取地址符号“&”:
pStruct=&student[2];
【实例】显示 5 名同学信息。在本实例中,使用之前声明的学生结构类型定义结构体数组,并对其进行初始化操作。通过指向该数组的指针,将其中元素的数据进行输出显示。
#include<stdio.h> struct Student /*学生结构体*/ { char cName[20]; /*姓名*/ int iNumber; /*学号*/ char cSex; /*性别*/ int iGrade; /*年级*/ } student[5]={{"WangJiasheng",12062212,'M',3}, {"YuLongjiao",12062213,'W',3}, {"JiangXuehuan",12062214,'W',3}, {"ZhangMeng",12062215,'W',3}, {"HanLiang",12062216,'M',3}}; /*定义数组并设置初始值*/ int main() { struct Student* pStruct; int index; pStruct=student; for(index=0;index<5;index++,pStruct++) { printf("NO%d 名学生:\n",index+1); /*首先输出学生的名次*/ /*使用变量 index 做下标,输出数组中的元素数据*/ printf("姓名: %s, 学号: %d\n",pStruct->cName,pStruct->iNumber); printf("性别: %c, 年级: %d\n",pStruct->cSex,pStruct->iGrade); printf("\n"); /*空格行*/ } return 0; }程序中:
- 定义了一个结构体数组 student[5],定义结构体指针变量 pStruct 指向该数组的首地址;
- for 循环中,pStruct 开始指向数组的首地址,也就是第一个元素的地址,因此使用 pStruct-> 引用的是第一个元素中的成员。使用输出函数显示成员变量表示的数据;
- 一次循环结束后,循环变量进行自加操作,pStruct 也执行自加运算。注意,pStruct++ 表示 pStruct 的增加值为一个数组元素大小,即数组元素中的第二个元素 student[1]。
运行程序,结果为:
NO1 名学生:
姓名: WangJiasheng, 学号: 12062212
性别: M, 年级: 3
NO2 名学生:
姓名: YuLongjiao, 学号: 12062213
性别: W, 年级: 3
NO3 名学生:
姓名: JiangXuehuan, 学号: 12062214
性别: W, 年级: 3
NO4 名学生:
姓名: ZhangMeng, 学号: 12062215
性别: W, 年级: 3
NO5 名学生:
姓名: HanLiang, 学号: 12062216
性别: M, 年级: 3