C语言结构体指针的用法(附带实例,新手必看)
所谓结构体指针,就是将一个结构体变量的起始地址存放在一个指针变量中,这个指针变量指向该结构体变量,这样的指针就叫做结构体指针。
结构体指针变量的类型必须与结构体变量的类型相同,结构体指针的定义形式为:
【实例】通过结构体指针变量访问成员。代码如下:
在第二种方法中,“.”的优先级高于“*”,(*pt) 两侧的括号不能省,若去掉括号,写成 *pt.title,则系统会认为是 *(pt.title),意义就不对了。
在第三种方法中,“->”为指向运算符。book_1.title、(*pt).title 和 pt->title 这三者是等价的。
【实例】指向结构体的指针。
第一次循环 pt 指向 student[0],条件判断符合,输出 student[0] 的值,执行 pt++ 后,pt 指向 student[1]。第二次循环,条件判断符合,输出 student[1] 的值,执行 pt++ 后,pt 指向 student[2]。第三次循环,pt 中存放的地址已经大于 student[2] 的地址,条件不符合,退出 for 循环。
结构体指针变量的类型必须与结构体变量的类型相同,结构体指针的定义形式为:
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 中的成员值:
- book_1.成员名,如 book_1.title;
- (*pt).成员名,如 (*pt).title;
- pt->成员名,如 pt->title。
在第二种方法中,“.”的优先级高于“*”,(*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 循环。