C语言结构体指针如何定义和使用?(非常详细)

C语言结构体指针如何定义和使用?(非常详细)

一个指向结构体变量的指针,指向的是结构体变量的起始地址。除此以外,指针变量还可以指向结构体数组以及数组中的元素。

C语言指向结构体变量的指针

定义结构体指针的一般形式如下:

结构体类型 *指针名;

例如,定义一个指向 struct Student 结构类型的 pStruct 指针变量,代码如下:

struct Student *pStruct;

指针指向的是结构体变量的地址,因此可以使用指针来访问结构体中的成员,方式有两种。

1) 用成员运算符“.”引用结构成员

语法格式为为:

(*pStruct).成员名;

例如,pStruct 指针指向 student1 结构体变量,可以采用如下方式引用其中的成员。

(*pStruct).iNumber=12061212;

注意,*pStruct 一定放在括号内,这是因为成员运算符“.”的优先级最高,如果不使用括号,就会先执行“.”运算然后才是“*”运算。

【实例】某公司招聘新员工后,需要为其安排工位和所属部门。利用结构体类型指针编写程序,将所有新员工的信息输出。

#include /*包含头文件*/

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

#include

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() 函数前,要在程序中包含头文件

为成员赋值时,使用的是“->”运算符引用的成员变量,在程序的最后使用结构体变量和“.”运算符直接将成员的数据进行输出。

运行程序,结果为:

姓名: 张伟

票价: 285 元

乘车区间: 长春-北京

车次: D71

开车时间: 2021 年 2 月 20 日 09:08 开

C语言指向结构体数组的指针

结构体指针变量指向结构体数组时,指针变量的值就是结构体数组的首地址。还可以直接指向结构体数组中的元素,这时指针变量的值就是该结构体数组元素的首地址。

例如,定义一个结构体数组 student[5],使用结构体指针指向该数组,代码如下:

struct Student* pStruct;

pStruct=student;

因为数组不使用下标时表示的是数组的第一个元素的地址,所以指针指向数组的首地址。

如果想利用指针指向第 3 个元素,则在数组名后附加下标,然后在数组名前使用取地址符号“&”:

pStruct=&student[2];

【实例】显示 5 名同学信息。在本实例中,使用之前声明的学生结构类型定义结构体数组,并对其进行初始化操作。通过指向该数组的指针,将其中元素的数据进行输出显示。

#include

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

注意,(++pStruct)->Number 与 (pStruct++)->Number 的区别在于,前者先执行 ++ 操作,使 pStruct 指向下一个元素的地址,然后取得该元素的成员值;后者先取得当前元素的成员值,再使 pStruct 指向下一个元素的地址。

📌 相关推荐