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

C语言结构体指针的用法(附带实例,新手必看)

所谓结构体指针,就是将一个结构体变量的起始地址存放在一个指针变量中,这个指针变量指向该结构体变量,这样的指针就叫做结构体指针。

结构体指针变量的类型必须与结构体变量的类型相同,结构体指针的定义形式为:
struct 结构体名 *变量名;

【实例】通过结构体指针变量访问成员。代码如下:
#include <string.h>
#include <stdio.h>

struct book
{
   char title[20];
   long id;
   int price;
};

int main( )
{
    struct book book_1;
    struct book *pt;

    pt = &book_1;
    //对book_1进行初始化
    strcpy( book_1.title,"C语言入门教程");
    book_1.id = 1;
    book_1.price = 49.9;
    //通过结构体变量访问成员
    printf("书名:%s 编号:%ld 价格:%d\n",book_1.title,book_1.id,book_1.price);
    //通过结构体指针变量访问成员
    printf("书名:%s 编号:%ld 价格:%d\n",(*pt).title,(*pt).id,(*pt).price);
    printf("书名:%s 编号:%ld 价格:%d\n",pt->title,pt->id,pt->price);
  
    return 0;
}
编译运行,结果如下:
书名:C语言入门教程 编号:1 价格:49
书名:C语言入门教程 编号:1 价格:49
书名:C语言入门教程 编号:1 价格:49
可以看到,当结构体指针变量 pt 指向结构体变量 book_1 时,有以下 3 种方法访问 book_1 中的成员值:
在第二种方法中,“.”的优先级高于“*”,(*pt) 两侧的括号不能省,若去掉括号,写成 *pt.title,则系统会认为是 *(pt.title),意义就不对了。

在第三种方法中,“->”为指向运算符。book_1.title、(*pt).title 和 pt->title 这三者是等价的。

【实例】指向结构体的指针。
#include <stdio.h>
#define STU_NUM 2
struct stu{
    char *name; //姓名
    int num; //学号
    int age; //年龄
    float score; //成绩
}student[STU_NUM] = {
    {"张三", 1, 18, 97},
    {"李四", 2, 19, 96},
}, *pt;

int main()
{
    printf("Name\tNum\tAge\tScore\t\n");
    for(pt=student; pt<=student+(STU_NUM-1); pt++)
    {
        printf("%s\t%d\t%d\t%.1f\n",
               pt->name, pt->num, pt->age, pt->score);
    }

    return 0;
}
编译运行,结果如下:
Name   Num   Age   Score
张三     1    18    97.0
李四     2    19    96.0
可以看到,数组长度为 2,在 for 语句中先让结构体指针变量 pt 指向结构体数组 student 的首地址,即结构体数组 student[0] 的地址。

student+(STU_NUM−1)student+1,也就是 student[2]的地址,因此,for 的判断条件为结构体指针变量 pt 存放的地址是否小于等于 student[2] 的地址。

pt++ 使得结构体指针变量 pt 自加 1,结构体指针变量 pt 加 1 意味着结构体指针变量 pt 所增加的值为结构体数组 student 的一个元素所占的字节数。

第一次循环 pt 指向 student[0],条件判断符合,输出 student[0] 的值,执行 pt++ 后,pt 指向 student[1]。第二次循环,条件判断符合,输出 student[1] 的值,执行 pt++ 后,pt 指向 student[2]。第三次循环,pt 中存放的地址已经大于 student[2] 的地址,条件不符合,退出 for 循环。

相关文章