C语言中的点运算符是一个二元操作符,主要作用就是访问结构体或者联合体的成员。它的左边必须是结构体或联合体的实例变量,右边是对应的成员名称,通过这种方式可以直接操作结构体内部的成员数据。

点运算符的基本语法
点运算符的基本使用格式非常固定,结构如下:
结构体变量名.成员名
这里的结构体变量名必须是已经定义好的结构体类型的实例,成员名则是该结构体中声明的某个成员标识。如果结构体嵌套了其他结构体,那么可以连续使用点运算符逐层访问内部的成员。
点运算符在结构体访问中的基础示例
我们先定义一个简单的结构体类型,然后创建实例用点运算符访问成员:
#include <stdio.h>
#include <string.h>
// 定义学生结构体
struct Student {
char name[20];
int age;
float score;
};
int main() {
// 创建结构体实例
struct Student stu1;
// 用点运算符给成员赋值
strcpy(stu1.name, "张三");
stu1.age = 18;
stu1.score = 92.5;
// 用点运算符读取成员值并打印
printf("学生姓名:%sn", stu1.name);
printf("学生年龄:%dn", stu1.age);
printf("学生成绩:%.1fn", stu1.score);
return 0;
}
上面的代码中,stu1.name、stu1.age、stu1.score都是点运算符的典型用法,分别访问了stu1这个结构体实例的三个成员,完成了赋值和读取操作。
嵌套结构体的点运算符访问
如果结构体内部包含了其他结构体类型的成员,那么可以通过连续使用点运算符逐层访问,不需要额外的语法:
#include <stdio.h>
// 定义日期结构体
struct Date {
int year;
int month;
int day;
};
// 定义员工结构体,包含日期结构体成员
struct Employee {
char name[20];
struct Date entry_date; // 入职日期,嵌套结构体成员
float salary;
};
int main() {
struct Employee emp;
// 连续使用点运算符给嵌套的成员赋值
strcpy(emp.name, "李四");
emp.entry_date.year = 2023;
emp.entry_date.month = 3;
emp.entry_date.day = 15;
emp.salary = 8500.0;
printf("员工姓名:%sn", emp.name);
printf("入职日期:%d-%d-%dn", emp.entry_date.year, emp.entry_date.month, emp.entry_date.day);
printf("薪资:%.1fn", emp.salary);
return 0;
}
这里emp.entry_date.year就是先通过emp.entry_date访问到entry_date这个嵌套的Date结构体实例,再继续用点运算符访问它的year成员。
点运算符和箭头运算符的区别
很多初学者会混淆点运算符和箭头运算符->,两者的核心区别是操作对象不同:
- 点运算符的操作对象必须是结构体/联合体实例,也就是非指针类型的结构体变量
- 箭头运算符的操作对象必须是指向结构体/联合体的指针,需要先通过指针找到对应的实例,再访问成员
我们可以通过下面的例子直观看到两者的区别:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Book {
char title[30];
float price;
};
int main() {
// 结构体实例,用点运算符访问
struct Book book1;
strcpy(book1.title, "C语言入门");
book1.price = 59.9;
// 指向结构体的指针,用箭头运算符访问
struct Book *book_ptr = &book1;
printf("书名:%s,价格:%.1fn", book_ptr->title, book_ptr->price);
// 指针也可以先解引用再用点运算符,等价写法
printf("书名:%s,价格:%.1fn", (*book_ptr).title, (*book_ptr).price);
return 0;
}
注意(*book_ptr).title这种写法中,括号不能省略,因为点运算符的优先级高于解引用运算符,如果写成*book_ptr.title会先执行book_ptr.title导致语法错误。
点运算符的使用注意事项
使用点运算符的时候需要注意几个常见的问题:
- 左边的操作数必须是已经定义完成的结构体实例,不能是结构体类型名,比如
struct Student.age是错误写法 - 右边的成员名必须是该结构体类型中确实声明的成员,不能访问不存在的成员
- 如果结构体成员是数组,那么用点运算符访问到数组名之后,可以再按数组的方式操作,比如
stu1.name[0] = '王'是合法的 - 点运算符返回的是对应成员的左值,所以可以直接对其赋值,也可以读取它的值参与运算
点运算符是C语言结构体操作的基础,只要记住它只能用于结构体/联合体实例访问成员,和指针场景的箭头运算符区分开,就可以避免大部分使用错误。