首页 > 编程笔记 > C语言笔记 阅读:23

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

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

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;/*程序结束*/
}
程序中:
运行程序,结果为:
----信息如下-----
姓名: 张伟
职工号: 14
部门: 开发部

2) 用指向运算符“->”引用结构成员

语法格式为:
pStruct->成员名;

例如,使用指向运算符引用一个变量的成员:
pStruct->iNumber=12061212;
注意,在使用“->”引用成员时,要注意分析以下情况:
总结一下,假如 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;
}
程序中:
运行程序,结果为:
姓名: 张伟
票价: 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;
}
程序中:
运行程序,结果为:

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 指向下一个元素的地址。

相关文章