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
ICP备案:
公安联网备案: