- 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语言 - return 语句
- 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语言中的点(.)运算符
C语言中的点(.)运算符
C语言中的**点(.)运算符**也称为“**成员选择运算符**”。它用于选择结构体和联合体的成员。**点(.)运算符**是一个二元运算符,需要两个操作数(结构体或联合体的名称和成员名称),并且它具有最高的运算符优先级。
当您想要访问和操作结构体和联合体的成员(变量)时,**点(.)运算符**非常有用。
使用点(.)运算符
点(.)运算符使用结构体和联合体变量名来选择结构体和联合体的成员。以下是使用点(.)运算符访问结构体或联合体成员的语法:
var.member;
这里,var是某种struct或union类型的变量,而member是在创建结构体或联合体时定义的元素之一。
示例
使用以下语法,用struct关键字定义一个新的派生数据类型:
struct newtype { type elem1; type elem2; type elem3; ... ... };
然后,您可以声明此派生数据类型的变量,如下所示:
struct newtype var;
要访问某个成员,
var.elem1;
结构体(struct)中的点运算符
如上所述,点(.)运算符用于访问和操作结构体的成员。
示例
让我们声明一个名为book的struct类型和一个struct变量。以下示例显示了如何使用点运算符(.)访问book结构体中的成员。
请看下面的例子:
#include <stdio.h> struct book { char title[10]; double price; int pages; }; int main (){ struct book b1 = {"Learn C", 675.50, 325}; printf("Title: %s\n", b1.title); printf("Price: %lf\n", b1.price); printf("No of Pages: %d\n", b1.pages); printf("size of book struct: %d", sizeof(struct book)); return 0; }
输出
运行此代码时,将产生以下输出:
Title: Learn C Price: 675.500000 No of Pages: 325 size of book struct: 32
联合体中的点运算符
C语言中的union关键字也允许您定义派生数据类型,这与struct关键字非常相似。但是,与struct变量不同,union类型的变量在任何给定时间只能有一个成员包含值。
点(.)运算符也用于访问和操作联合体的成员。
示例
您也可以使用点运算符访问联合体成员元素,如本例所示:
#include <stdio.h> union Data { int i; float f; char str[20]; }; int main(){ union Data data; data.i = 10; data.f = 220.5; strcpy( data.str, "C Programming"); printf( "data.i : %d\n", data.i); printf( "data.f : %f\n", data.f); printf( "data.str : %s\n", data.str); return 0; }
输出
编译并执行上述代码后,将产生以下结果:
data.i : 1917853763 data.f : 4122360580327794860452759994368.000000 data.str : C Programming
嵌套结构体中的点运算符
当struct类型的一个元素本身就是一个或多个类型的复合表示时,就定义了嵌套结构体。
点运算符也可以用于访问嵌套结构体(以及联合体类型)的成员。这与普通结构体的访问方式相同。
假设我们有如下嵌套结构体:
struct struct1 { var1; var2; struct struct2 { var3; var4; } s2; } s1;
在这种情况下,s1的成员如前所述被访问(作为s1.var1和s1.var2),而内部结构体的成员被访问为:
s1.s2.var3;
示例
在这个例子中,我们有一个employee数据类型,它的一个元素是出生日期(dob)。我们将在employee结构体中声明包含三个int类型“d”、“m”和“y”的dob结构体,并且它的变量d1是外部类型的一个元素。
#include <stdio.h> struct employee { char name[10]; float salary; struct dob { int d, m, y; } d1; }; int main(){ struct employee e1 = {"Kiran", 25000, {12, 5, 1990}}; printf("Name: %s\n", e1.name); printf("Salary: %f\n", e1.salary); printf("Date of Birth: %d-%d-%d\n", e1.d1.d, e1.d1.m, e1.d1.y); return 0; }
输出
运行代码并检查其输出:
Name: Kiran Salary: 25000.000000 Date of Birth: 12-5-1990
使用箭头运算符访问成员
C语言还有另一种方法可以访问struct变量的成员。这可以通过指针指向struct变量,使用箭头运算符(->)来实现。
使用struct关键字定义一个新的派生数据类型,语法如下:
struct newtype { type elem1; type elem2; type elem3; ... ... };
然后,您可以声明此派生数据类型的变量及其指针,如下所示:
struct newtype var; struct newtype *ptr=&var;
要通过指针访问某个成员,请使用以下语法:
ptr->elem1;
示例
请看下面的例子:
#include <stdio.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 struct1 { var1; var2; struct struct2 { var3; var4; } s2; } s1; struct struct1 *ptr=&s1;
要访问嵌套结构体的内部结构体的元素,我们使用以下语法:
ptr -> s2.var3;
示例
请看下面的例子:
#include <stdio.h> struct employee { char name[10]; float salary; struct dob { int d, m, y; } d1; }; int main(){ struct employee e1 = {"Kiran", 25000, {12, 5, 1990}}; struct employee *ptr = &e1; printf("Name: %s\n", ptr->name); printf("Salary: %f\n", ptr->salary); printf("Date of Birth: %d-%d-%d\n", ptr->d1.d, ptr->d1.m, ptr->d1.y); return 0; }
输出
运行代码并检查其输出:
Name: Kiran Salary: 25000.000000 Date of Birth: 12-5-1990