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