问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言结构体指针详解

创作时间:
作者:
@小白创作中心

C语言结构体指针详解

引用
CSDN
1.
https://m.blog.csdn.net/m0_74195174/article/details/137797805

引言:
结构体指针是指向结构体变量的指针。在C或C++中,结构体是一种用户自定义的数据类型,它允许你将不同类型的数据组合成一个单独的类型。结构体指针则用于存储结构体变量的地址,并允许你通过指针来访问和操作结构体的成员。

1 结构体定义

首先,你需要定义一个结构体。例如:

struct Student {
    char name[50];
    int age;
    float score;
};

这里定义了一个名为Student的结构体,包含三个成员:name(一个字符数组用于存储学生姓名)、age(一个整数用于存储学生年龄)和score(一个浮点数用于存储学生成绩)。

2 结构体变量的创建和初始化

你可以创建结构体变量并初始化它:

struct Student student1;
strcpy(student1.name, "Alice");
student1.age = 20;
student1.score = 90.5;

3 结构体指针的声明和使用

接下来,你可以声明一个指向Student结构体的指针:

struct Student *ptr;

现在,ptr是一个指向Student类型数据的指针。你可以让它指向一个已存在的结构体变量:

ptr = &student1;

现在,ptr指向student1,你可以通过ptr来访问和修改student1的成员:

printf("Name: %s\n", ptr->name);
printf("Age: %d\n", ptr->age);
printf("Score: %.2f\n", ptr->score);
// 修改成员值
ptr->age = 21;

这里使用了->运算符来通过结构体指针访问结构体的成员。这个运算符首先解引用指针以获取结构体,然后访问结构体的成员。

4 动态分配内存给结构体

你还可以使用malloccalloc来动态分配内存给一个结构体指针:

struct Student *ptr2 = (struct Student *)malloc(sizeof(struct Student));
if (ptr2 != NULL) {
    strcpy(ptr2->name, "Bob");
    ptr2->age = 22;
    ptr2->score = 85.0;
} else {
    // 处理内存分配失败的情况
}

记得在使用完动态分配的内存后,使用free函数释放它:

free(ptr2);

5 结构体数组和指针

你还可以有指向结构体数组的指针。例如:

struct Student students[3];
struct Student *ptrArray = students;
// 访问数组元素
strcpy(ptrArray[0].name, "Charlie");
ptrArray[0].age = 23;
ptrArray[0].score = 92.0;
// 通过指针访问
printf("Name of first student: %s\n", ptrArray->name);

在这个例子中,ptrArray指向students数组的第一个元素。你可以通过指针的算术运算来遍历数组中的其他元素。

结构体指针是C和C++编程中非常有用的工具,它们允许你以灵活和高效的方式处理复杂的数据结构。

6 部分代码分析

struct Student *ptr2 = (struct Student *)malloc(sizeof(struct Student));

这段代码在C或C++中用于动态地为一个Student结构体分配内存,并将返回的内存地址赋值给一个指向Student结构体的指针。下面是对这段代码的详细解释:

  1. struct Student:这是一个用户定义的结构体类型,它包含了一些成员变量,用于存储学生的信息。在这个上下文中,我们假设Student结构体已经被定义过了,比如:
struct Student {
    char name[50];
    int age;
    float score;
};
  1. struct Student *ptr2:这声明了一个名为ptr2的指针,它指向Student结构体类型。此时,ptr2并未初始化,它不指向任何有效的内存地址。

  2. malloc(sizeof(struct Student))

  • malloc是一个标准库函数,用于在堆上动态分配指定字节数的内存。它返回一个指向所分配内存块的指针,如果分配失败则返回NULL

  • sizeof(struct Student)计算Student结构体类型所需的字节数。这确保了分配的内存块足够大,能够存储一个完整的Student结构体实例。

  1. (struct Student *):这是一个类型转换,将malloc返回的void*类型的指针转换为struct Student*类型的指针。在C语言中,malloc返回的是一个void*类型的通用指针,它必须被显式转换为适当的类型指针才能使用。在C++中,这种转换通常是不必要的,因为malloc通常不会被用在C++代码中,而是使用new运算符。

  2. struct Student *ptr2 = ...:整个表达式的结果(即分配的内存的地址)被赋值给ptr2指针。现在,ptr2指向一个新分配的、足够大的内存块,用于存储一个Student结构体。

使用malloc分配的内存必须在使用完毕后通过free函数释放,以避免内存泄漏。例如:

free(ptr2);

在释放内存后,通常会将指针设置为NULL,以防止悬垂指针(dangling pointer)的问题:

ptr2 = NULL;

这样,如果之后不小心尝试访问ptr2指向的内存,程序会更容易检测到这个错误(因为访问NULL指针通常会导致运行时错误),而不是访问已经释放的内存,这可能导致不可预测的行为。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号