1、使用箭头操作符访问结构体成员
有一个结构体指针时,可以使用箭头操作符来访问结构体的成员,而不需要使用间接运算符 *
来解引用指针。箭头操作符是 ->
,其作用是访问指针指向的结构体中的成员。
#include <stdio.h>
struct Person {
char name[50];
int age;
};
int main() {
// 定义结构体实例
struct Person person1 = {"Alice", 30};
// 定义结构体指针
struct Person *ptr = &person1;
// 使用箭头操作符访问结构体成员
printf("Name: %s\n", ptr->name);
printf("Age: %d\n", ptr->age);
return 0;
}
2、使用箭头操作符的原因
C 语言中,结构体指针和结构体变量的访问方式不同,结构体变量直接使用点操作符(.
)访问结构体成员。结构体指针使用箭头操作符(->
)来访问结构体成员。
#include <stdio.h>
struct Person {
char name[50];
int age;
};
int main() {
// 创建结构体变量并初始化
struct Person p1 = {"Alice", 30};
// 创建结构体指针并指向 p1
struct Person *ptr = &p1;
// 使用点操作符访问结构体成员
printf("通过结构体变量访问: %s\n", p1.name); // 通过结构体变量访问成员
printf("通过结构体变量访问年龄: %d\n", p1.age);
// 使用箭头操作符访问结构体成员
printf("通过结构体指针访问: %s\n", ptr->name); // 通过结构体指针访问成员
printf("通过结构体指针访问年龄: %d\n", ptr->age);
return 0;
}
3、使用箭头操作符时常见的错误
使用箭头操作符时,确保你有一个指向结构体的指针。如果是结构体实例,使用点操作符。永远不要在空指针上使用箭头操作符。在传递结构体到函数时,根据是否为指针来选择使用箭头操作符或点操作符。
1) 错误地使用点操作符(.
)代替箭头操作符(->
)
当我们有一个指向结构体的指针时,必须使用箭头操作符 ->
来访问结构体成员,而不是使用点操作符(.
),后者是用于直接访问结构体的成员。
#include <stdio.h>
struct Person {
char *name;
int age;
};
int main() {
struct Person p;
p.name = "John"; // 使用点操作符直接访问成员,或者通过指针访问成员使用箭头操作符
struct Person *ptr = &p;
ptr->name = "John"; // 正确:使用箭头操作符访问成员
printf("Name: %s\n", ptr->name); // 输出: Name: John
return 0;
}
2)忘记解引用指针
如果指针没有被初始化或没有指向有效的内存位置(如 malloc
分配内存),访问成员会导致未定义的行为。
#include <stdio.h>
#include <string.h>
struct Person {
char name[20];
int age;
};
int main() {
// 方法 1: 为指针分配内存
struct Person *p = malloc(sizeof(struct Person)); // 动态分配内存
if (p == NULL) {
printf("内存分配失败!\n");
return 1;
}
// 初始化数据
strcpy(p->name, "John Doe");
p->age = 30;
// 使用结构体成员
printf("Name: %s, Age: %d\n", p->name, p->age);
// 释放内存
free(p);
// 方法 2: 使用结构体实例
struct Person person = {"Jane Smith", 25};
p = &person; // 让指针指向 person
// 使用结构体成员
printf("Name: %s, Age: %d\n", p->name, p->age);
return 0;
}
3)空指针解引用
在使用箭头操作符前,确保指针指向有效的内存位置,否则会导致运行时错误。
#include <stdio.h>
#include <stdlib.h>
struct Person {
char name[50];
int age;
};
int main() {
// 定义一个 Person 类型的结构体指针,并将其初始化为 NULL
struct Person *ptr = NULL;
// 错误:空指针解引用
// 当我们尝试访问指针指向的内容时,由于 ptr 为 NULL,这会导致程序崩溃
printf("%s\n", ptr->name); // 会导致程序崩溃
return 0;
}