C语言结构体指针的用法(非常详细)
在 C 语言程序中,一个指向变量的指针表示的是变量所占内存的起始地址。如果一个指针指向结构体变量,那么该指针指向的是结构体变量的起始地址。同样指针也可以指向结构体数组中的元素。
定义结构体指针的一般形式如下:
1) 第一种方法是使用“.”运算符引用结构成员,代码如下:
注意,*pStruct 一定要使用括号进行标识,因为“.”运算符的优先级是最高的,如果不使用括号,就会先执行“.”运算然后才执行“*”运算。
例如,pStruct 指针指向 telephone 结构体变量,引用其中的成员,代码如下:
具体代码如下:
输出消息提示,然后在 printf() 函数中使用指向结构变量的指针引用成员变量,将书架的信息输出。
2) 第二种方法是使用“->”运算符引用结构成员,格式如下:
例如,使用“->”运算符引用一个变量的成员,代码如下:
假如 telephone 为结构体变量,pStruct 为指向结构体变量的指针,以下 3 种形式的效果是等价的:
在使用“->”引用成员时,要注意分析以下情况:
【实例】定义结构体变量但不对其进行初始化操作,使用指针指向结构体变量并对其成员进行赋值操作。具体代码如下:
在为成员赋值时,使用的是“->”运算符引用的成员变量,在程序的最后使用结构体变量和“.”运算符直接将成员的数据输出。输出的结果表示使用“->”运算符为成员变量赋值成功。
结构体指针变量也可以直接指向结构体数组中的元素,这时指针变量的值就是该结构体数组元素的首地址。
例如,定义一个结构体数组 telephone[5],使用结构体指针指向该数组,代码如下:
因为数组不使用索引时表示的是数组的第一个元素的地址,所以指针指向数组的首地址。如果想使指针指向第三个元素,则在数组名后附加索引,然后在数组名前使用取地址符号“&”,例如:
【实例】声明学生结构体类型并定义结构体数组,然后对其进行初始化操作。通过指向该数组的指针,将其中的元素数据进行输出。具体代码如下:
C语言结构体指针的定义
由于指针指向结构体变量的地址,因此可以使用指针来访问结构体中的成员。定义结构体指针的一般形式如下:
结构体类型 *指针名;
例如,定义一个指向 struct telephone 结构体类型的 pStruct 指针变量,代码如下:struct telephone *pStruct;使用指向结构体变量的指针访问成员有两种方法,pStruct 为指向结构体变量的指针。
1) 第一种方法是使用“.”运算符引用结构成员,代码如下:
(*pStruct).成员名结构体变量可以使用“.”运算符对其中的成员进行引用。*pStruct 表示指向的结构体变量,因此使用“.”运算符可以引用结构体中的成员变量。
注意,*pStruct 一定要使用括号进行标识,因为“.”运算符的优先级是最高的,如果不使用括号,就会先执行“.”运算然后才执行“*”运算。
例如,pStruct 指针指向 telephone 结构体变量,引用其中的成员,代码如下:
(*pStruct).price=3299;声明书架结构体,为结构体定义变量并进行初始化赋值,然后使用指针指向该结构体变量,最后通过指针引用变量中的成员进行输出。
具体代码如下:
#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
输出消息提示,然后在 printf() 函数中使用指向结构变量的指针引用成员变量,将书架的信息输出。
2) 第二种方法是使用“->”运算符引用结构成员,格式如下:
结构体指针变量->成员名;
例如,使用“->”运算符引用一个变量的成员,代码如下:
pStruct->price=3299;
假如 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元
颜色: 粉色
<string.h>
。在为成员赋值时,使用的是“->”运算符引用的成员变量,在程序的最后使用结构体变量和“.”运算符直接将成员的数据输出。输出的结果表示使用“->”运算符为成员变量赋值成功。
C语言结构体数组指针
结构体指针变量不但可以指向结构体变量,还可以指向结构体数组,此时指针变量的值就是该结构体数组的首地址。结构体指针变量也可以直接指向结构体数组中的元素,这时指针变量的值就是该结构体数组元素的首地址。
例如,定义一个结构体数组 telephone[5],使用结构体指针指向该数组,代码如下:
struct telephone* pStruct; pStruct=telephone1;
因为数组不使用索引时表示的是数组的第一个元素的地址,所以指针指向数组的首地址。如果想使指针指向第三个元素,则在数组名后附加索引,然后在数组名前使用取地址符号“&”,例如:
pStruct=&telephone1[2];
【实例】声明学生结构体类型并定义结构体数组,然后对其进行初始化操作。通过指向该数组的指针,将其中的元素数据进行输出。具体代码如下:
#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]。