- C 编程教程
- C - 首页
- C语言基础
- C - 概述
- C - 特性
- C - 历史
- C - 环境设置
- C - 程序结构
- C - Hello World
- C - 编译过程
- C - 注释
- C - 词法单元
- C - 关键字
- C - 标识符
- C - 用户输入
- C - 基本语法
- C - 数据类型
- C - 变量
- C - 整数提升
- C - 类型转换
- C - 类型强制转换
- C - 布尔值
- C语言中的常量和字面量
- C - 常量
- C - 字面量
- C - 转义序列
- C - 格式说明符
- C语言中的运算符
- C - 运算符
- C - 算术运算符
- C - 关系运算符
- C - 逻辑运算符
- C - 位运算符
- C - 赋值运算符
- C - 一元运算符
- C - 自增和自减运算符
- C - 三元运算符
- C - sizeof 运算符
- C - 运算符优先级
- C - 其他运算符
- C语言中的决策
- C - 决策
- C - if 语句
- C - if...else 语句
- C - 嵌套 if 语句
- C - switch 语句
- C - 嵌套 switch 语句
- C语言中的循环
- C - 循环
- C - while 循环
- C - for 循环
- C - do...while 循环
- C - 嵌套循环
- C - 无限循环
- C - break 语句
- C - continue 语句
- C - goto 语句
- C语言中的函数
- C - 函数
- C - 主函数
- C - 按值调用函数
- C - 按引用调用函数
- C - 嵌套函数
- C - 可变参数函数
- C - 用户定义函数
- C - 回调函数
- C - 返回语句
- C - 递归
- C语言中的作用域规则
- C - 作用域规则
- C - 静态变量
- C - 全局变量
- C语言中的数组
- C - 数组
- C - 数组的特性
- C - 多维数组
- C - 将数组传递给函数
- C - 从函数返回数组
- C - 可变长数组
- C语言中的指针
- C - 指针
- C - 指针和数组
- C - 指针的应用
- C - 指针运算
- C - 指针数组
- C - 指针到指针
- C - 将指针传递给函数
- C - 从函数返回指针
- C - 函数指针
- C - 指向数组的指针
- C - 指向结构体的指针
- C - 指针链
- C - 指针与数组
- C - 字符指针和函数
- C - 空指针
- C - void 指针
- C - 悬空指针
- C - 解引用指针
- C - 近、远和巨型指针
- C - 指针数组的初始化
- C - 指针与多维数组
- C语言中的字符串
- C - 字符串
- C - 字符串数组
- C - 特殊字符
- C语言中的结构体和联合体
- C - 结构体
- C - 结构体和函数
- C - 结构体数组
- C - 自引用结构体
- C - 查找表
- C - 点 (.) 运算符
- C - 枚举 (或 enum)
- C - 结构体填充和打包
- C - 嵌套结构体
- C - 匿名结构体和联合体
- C - 联合体
- C - 位域
- C - Typedef
- C语言中的文件处理
- C - 输入 & 输出
- C - 文件 I/O (文件处理)
- C 预处理器
- C - 预处理器
- C - 指令
- C - 预处理器运算符
- C - 宏
- C - 头文件
- C语言中的内存管理
- C - 内存管理
- C - 内存地址
- C - 存储类
- 其他主题
- C - 错误处理
- C - 可变参数
- C - 命令执行
- C - 数学函数
- C - static 关键字
- C - 随机数生成
- C - 命令行参数
- C 编程资源
- C - 问题 & 答案
- C - 快速指南
- C - 速查表
- C - 有用资源
- C - 讨论
C语言中的结构体指针
如果使用关键字struct定义了一个派生数据类型,则可以声明此类型的变量。因此,您还可以声明一个指针变量来存储其地址。指向结构体的指针因此是一个引用结构体变量的变量。
语法:定义和声明结构体
以下是如何使用“struct”关键字定义新的派生数据类型:
struct type {
type var1;
type var2;
type var3;
...
...
};
然后可以声明此派生数据类型的变量,如下所示:
struct type var;
然后可以声明一个指针变量并存储var的地址。要将变量声明为指针,必须以“*”为前缀;要获取变量的地址,我们使用“&”运算符。
struct type *ptr = &var;
访问结构体的元素
要使用指针访问结构体的元素,我们使用一个称为间接运算符 (→) 的特殊运算符。
在这里,我们定义了一个名为book的用户定义的 struct 类型。我们声明了一个book变量和一个指针。
struct book{
char title[10];
double price;
int pages;
};
struct book b1 = {"Learn C", 675.50, 325},
struct book *strptr;
要存储地址,请使用&运算符。
strptr = &b1;
使用间接运算符
在 C 编程中,我们对 struct 指针使用间接运算符 (“→”)。它也称为“struct 解引用运算符”。它有助于访问 struct 指针引用的 struct 变量的元素。
要访问 struct 中的单个元素,间接运算符的使用方法如下:
strptr -> title; strptr -> price; strptr -> pages;
struct 指针使用间接运算符或解引用运算符来获取 struct 变量的 struct 元素的值。点运算符 (“.”) 用于根据 struct 变量获取值。因此,
b1.title is the same as strpr -> title b1.price is the same as strptr -> price b1.pages is the same as strptr -> pages
示例:指向结构体的指针
以下程序显示了指向结构体的指针的用法。在此示例中,“strptr”是指向变量“struct book b1”的指针。因此,“strrptr → title”返回标题,类似于“b1.title”的作用。
#include <stdio.h>
#include <string.h>
struct book{
char title[10];
double price;
int pages;
};
int main(){
struct book b1 = {"Learn C", 675.50, 325};
struct book *strptr;
strptr = &b1;
printf("Title: %s\n", strptr -> title);
printf("Price: %lf\n", strptr -> price);
printf("No of Pages: %d\n", strptr -> pages);
return 0;
}
输出
Title: Learn C Price: 675.500000 No of Pages: 325
注意事项
- 点运算符 (.) 用于通过 struct 变量访问 struct 元素。
- 要通过其指针访问元素,必须使用间接运算符 (→)。
示例
让我们考虑另一个示例来了解指向结构体的指针是如何工作的。在这里,我们将使用关键字struct定义一个名为person的新派生数据类型,然后我们将声明其类型的变量和一个指针。
系统提示用户输入该人的姓名、年龄和体重。通过使用间接运算符访问结构体元素,将值存储在结构体元素中。
#include <stdio.h>
#include <string.h>
struct person{
char *name;
int age;
float weight;
};
int main(){
struct person *personPtr, person1;
strcpy(person1.name, "Meena");
person1.age = 40;
person1.weight = 60;
personPtr = &person1;
printf("Displaying the Data: \n");
printf("Name: %s\n", personPtr -> name);
printf("Age: %d\n", personPtr -> age);
printf("Weight: %f", personPtr -> weight);
return 0;
}
输出
运行此程序时,将产生以下输出:
Displaying the Data: Name: Meena Age: 40 weight: 60.000000
C 允许您声明“struct 数组”以及“指针数组”。在这里,struct 指针数组中的每个元素都是对 struct 变量的引用。
struct 变量类似于基本类型的普通变量,因为您可以拥有 struct 数组,可以将 struct 变量传递给函数,以及从函数返回 struct。
注意:在声明时,需要在变量或指针名称前加上“struct 类型”。但是,可以通过使用typedef关键字创建简写表示法来避免这种情况。
为什么需要指向结构体的指针?
指向结构体的指针非常重要,因为您可以使用它们来创建复杂的动态数据结构,例如链接列表、树、图等。此类数据结构使用自引用 struct,其中我们定义一个 struct 类型,其中一个元素是指向同一类型的指针。
具有指向其自身类型元素的指针的自引用结构体的示例定义如下:
struct mystruct{
int a;
struct mystruct *b;
};
我们将在下一章学习自引用结构体。