由于指针指向结构体变量的地址,因此可以使用指针来访问结构体中的成员。
定义结构体指针的一般形式如下:结构体类型 *指针名; 例如,定义一个指向 struct telephone 结构体类型的 pStruct 指针变量,代码如下:- struct telephone *pStruct;
使用指向结构体变量的指针访问成员有两种方法,pStruct 为指向结构体变量的指针。
1) 第一种方法是使用“.”运算符引用结构成员,代码如下:(*pStruct).成员名结构体变量可以使用“.”运算符对其中的成员进行引用。*pStruct 表示指向的结构体变量,因此使用“.”运算符可以引用结构体中的成员变量。
注意,*pStruct 一定要使用括号进行标识,因为“.”运算符的优先级是最高的,如果不使用括号,就会先执行“.”运算然后才执行“*”运算。
例如,pStruct 指针指向 telephone 结构体变量,引用其中的成员,代码如下:
声明书架结构体,为结构体定义变量并进行初始化赋值,然后使用指针指向该结构体变量,最后通过指针引用变量中的成员进行输出。
具体代码如下:- #define _CRT_SECURE_NO_WARNINGS
- #include<stdio.h> /*包含头文件*/
- struct Book /*定义书架结构体*/
- {
- char cName[20]; /*书架类别*/
- int iNumber; /*书架编号*/
- char cS[20]; /*图书编号*/
- }book={"electric",56,"134-467"}; /*对结构体变量初始化*/
- int main() /*主函数main()*/
- {
- struct Book* pStruct; /*定义结构体类型的指针*/
- pStruct=&book; /*指针指向结构体变量*/
- printf("-----the bookcase's information-----\n"); /*提示信息*/
- /*使用指针输出结构体成员*/
- printf("书架类别: %s\n",(*pStruct).cName);
- printf("书架编号: %d\n",(*pStruct).iNumber);
- printf("图书编号: %s\n",(*pStruct).cS);
- return 0; /*程序结束*/
- }
运行程序,结果为:-----the bookcase's information-----
书架类别: electric
书架编号: 56
图书编号: 134-467 首先在程序中声明结构类型,同时定义变量 book,对变量进行初始化的操作。定义结构体指针变量 pStruct,然后执行“pStruct=&book;”操作使指针指向 book 变量。
输出消息提示,然后在 printf() 函数中使用指向结构变量的指针引用成员变量,将书架的信息输出。
2) 第二种方法是使用“->”运算符引用结构成员,格式如下:结构体指针变量->成员名;
例如,使用“->”运算符引用一个变量的成员,代码如下:
假如 telephone 为结构体变量,pStruct 为指向结构体变量的指针,以下 3 种形式的效果是等价的:telephone.成员名;(*pStruct).成员名;pStruct->成员名;
在使用“->”引用成员时,要注意分析以下情况:- pStruct->price,表示指向结构体变量中成员 price 的值;
- pStruct->price++,表示指向结构体变量中成员 price 的值,使用后该值加 1;
- ++pStruct-> price,表示指向结构体变量中成员 price 的值加 1,计算后再进行使用。
【实例】定义结构体变量但不对其进行初始化操作,使用指针指向结构体变量并对其成员进行赋值操作。具体代码如下:- #define _CRT_SECURE_NO_WARNINGS
- #include<stdio.h> /*包含头文件*/
- #include<string.h>
- struct Sweat /*定义衣服结构体*/
- {
- char cName[20]; /*衣服种类*/
- int iNumber; /*衣服价格*/
- char cColor[20]; /*衣服颜色*/
- }sweat; /*定义变量*/
- int main() /*主函数main()*/
- {
- struct Sweat* pStruct; /*定义结构体类型的指针*/
- pStruct=&sweat; /*指针指向结构体变量*/
- strcpy(pStruct->cName,"毛呢外套"); /*为种类赋值*/
- pStruct->iNumber=599; /*为价格赋值*/
- strcpy(pStruct->cColor,"粉色"); /*为颜色赋值*/
- printf("-----the sweat's information-----\n"); /*提示信息*/
- printf("种类: %s\n",sweat.cName); /*输出结构体成员*/
- printf("价格: %d元\n",sweat.iNumber);
- printf("颜色: %s\n",sweat.cColor);
- return 0; /*程序结束*/
- }
运行程序,结果为:-----the sweat's information-----
种类: 毛呢外套
价格: 599元
颜色: 粉色 程序中使用了 strcpy() 函数将一个字符串常量复制到成员变量中,使用该函数要在程序中包含头文件 <string.h>。
在为成员赋值时,使用的是“->”运算符引用的成员变量,在程序的最后使用结构体变量和“.”运算符直接将成员的数据输出。输出的结果表示使用“->”运算符为成员变量赋值成功。
C语言结构体数组指针结构体指针变量不但可以指向结构体变量,还可以指向结构体数组,此时指针变量的值就是该结构体数组的首地址。
结构体指针变量也可以直接指向结构体数组中的元素,这时指针变量的值就是该结构体数组元素的首地址。
例如,定义一个结构体数组 telephone[5],使用结构体指针指向该数组,代码如下:- struct telephone* pStruct;
- pStruct=telephone1;
因为数组不使用索引时表示的是数组的第一个元素的地址,所以指针指向数组的首地址。如果想使指针指向第三个元素,则在数组名后附加索引,然后在数组名前使用取地址符号“&”,例如:
【实例】声明学生结构体类型并定义结构体数组,然后对其进行初始化操作。通过指向该数组的指针,将其中的元素数据进行输出。具体代码如下:- #define _CRT_SECURE_NO_WARNINGS
- #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 student:\n",index+1); /*首先输出学生的学号*/
- /*使用变量index作为索引,输出数组中的元素*/
- printf("Name: %s, Number: %d\n",pStruct->cName,pStruct->iNumber);
- printf("Sex: %c, Grade: %d\n",pStruct->cSex,
- pStruct->iGrade);
- printf("\n"); /*换行*/
- }
- return 0;
- }
运行程序,结果为:NO1 student:
Name: WangJiasheng, Number: 12062212
Sex: M, Grade: 3
NO2 student:
Name: YuLongjiao, Number: 12062213
Sex: W, Grade: 3
NO3 student:
Name: JiangXuehuan, Number: 12062214
Sex: W, Grade: 3
NO4 student:
Name: ZhangMeng, Number: 12062215
Sex: W, Grade: 3
NO5 student:
Name: HanLiang, Number: 12062216
Sex: M, Grade: 3 从该实例代码和运行结果可以看出如下内容:- 代码中定义了一个结构体数组 student[5],定义结构体指针变量 pStruct 指向该数组的首地址。使用 for 语句,对数组元素进行循环。
- 在循环语句块中,pStruct 刚开始时指向数组的首地址,也就是第一个元素的地址,因此 pStruct->引用的是第一个元素中的成员。使用输出函数输出成员变量表示的数据。
- 当一次循环结束之后,循环变量进行自加操作,同时 pStruct 也执行自加运算。这里需要注意的是,pStruct++ 表示 pStruct 自加的值为一个数组元素的大小,也就是说 pStruct++ 表示的是数组中的第二个元素 student[1]。
|