【c 语言】结构体指针

在这里插入图片描述

🎈个人主页:豌豆射手^
🎉欢迎 👍点赞✍评论⭐收藏
🤗收录专栏:C语言
🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步!

在这里插入图片描述

引言:

结构体指针是指向结构体变量的指针。在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结构体实例。
  3. (struct Student *):这是一个类型转换,将malloc返回的void*类型的指针转换为struct Student*类型的指针。在C语言中,malloc返回的是一个void*类型的通用指针,它必须被显式转换为适当的类型指针才能使用。在C++中,这种转换通常是不必要的,因为malloc通常不会被用在C++代码中,而是使用new运算符。

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

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

free(ptr2);

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

ptr2 = NULL;

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

总结

这篇文章到这里就结束了

谢谢大家的阅读!

如果觉得这篇博客对你有用的话,别忘记三连哦。

我是豌豆射手^,让我们我们下次再见

在这里插入图片描述

在这里插入图片描述

  • 35
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值