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

C语言结构体指针的用法(非常详细)

在 C 语言程序中,一个指向变量的指针表示的是变量所占内存的起始地址。如果一个指针指向结构体变量,那么该指针指向的是结构体变量的起始地址。同样指针也可以指向结构体数组中的元素。

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

首先在程序中声明结构类型,同时定义变量 book,对变量进行初始化的操作。定义结构体指针变量 pStruct,然后执行“pStruct=&book;”操作使指针指向 book 变量。

输出消息提示,然后在 printf() 函数中使用指向结构变量的指针引用成员变量,将书架的信息输出。

2) 第二种方法是使用“->”运算符引用结构成员,格式如下:
结构体指针变量->成员名; 

例如,使用“->”运算符引用一个变量的成员,代码如下:
pStruct->price=3299;

假如 telephone 为结构体变量,pStruct 为指向结构体变量的指针,以下 3 种形式的效果是等价的:
telephone.成员名;
(*pStruct).成员名;
pStruct->成员名;

在使用“->”引用成员时,要注意分析以下情况:
【实例】定义结构体变量但不对其进行初始化操作,使用指针指向结构体变量并对其成员进行赋值操作。具体代码如下:
#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;

因为数组不使用索引时表示的是数组的第一个元素的地址,所以指针指向数组的首地址。如果想使指针指向第三个元素,则在数组名后附加索引,然后在数组名前使用取地址符号“&”,例如:
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

从该实例代码和运行结果可以看出如下内容:

相关文章