【c 语言】结构体指针

news2024/11/24 0:03:27

在这里插入图片描述

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

【c 语言】结构体指针

      • 1 结构体定义
      • 2 结构体变量的创建和初始化
      • 3 结构体指针的声明和使用
      • 4 动态分配内存给结构体
      • 5 结构体数组和指针
      • 6 部分代码分析
  • 总结

在这里插入图片描述

引言:

结构体指针是指向结构体变量的指针。在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指针通常会导致运行时错误),而不是访问已经释放的内存,这可能导致不可预测的行为。

总结

这篇文章到这里就结束了

谢谢大家的阅读!

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

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

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1600948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年4月最新版GPT

2024年4月最新版ChatGPT/GPT4, 附上最新的使用教程。 随着人工智能技术的不断发展,ChatGPT和GPT4已经成为了人们日常生活中不可或缺的助手。2024年4月,OpenAI公司推出了最新版本的GPT4,带来了更加强大的功能和更加友好的用户体验。本文将为大家带来最新版GPT4的实用…

外网如何访问内网数据库?

企业和个人常常需要在外部网络环境中访问内部的数据库资源。这也是为了实现更大范围的资源共享和便捷的工作模式。由于网络安全和防火墙的限制,外网访问内网数据库并不是一件容易的事情。 在解决这个问题的过程中,天联组网应运而生。天联组网是一款异地组…

AIGC实战——VQ-GAN(Vector Quantized Generative Adversarial Network)

AIGC实战——VQ-GAN 0. 前言1. VQ-GAN2. ViT VQ-GAN小结系列链接 0. 前言 本节中,我们将介绍 VQ-GAN (Vector Quantized Generative Adversarial Network) 和 ViT VQ-GAN,它们融合了变分自编码器 (Variational Autoencoder, VAE)、Transformer 和生成对…

科技驱动未来,提升AI算力,GPU扩展正当时

要说这两年最火的科技是什么?我想“AI人工智能”肯定是最有资格上榜的,尤其ChatGPT推出后迅速在社交媒体上走红,短短5天,注册用户数就超过100万,2023年一月末,ChatGPT的月活用户更是突破1亿,成为…

内网kift私有网盘如何实现在外网公网访问?快解析映射方案

KIFT是一款面向个人、团队、小型组织的网盘服务器系统,安装运行比较简单,开箱即用,下载解压,双击jar文件即可启动。因为是开源的,不少人选择使用KIFT做开源私有网盘,有能力的大佬还可以对它进行定制开发。 …

python 列表对象函数

对象函数必须通过一个对象调用。 列表名.函数名() append() 将某一个元素对象添加在列表的表尾 如果添加的是其他的序列,该序列也会被看成是一个数据对象 count() 统计列表当中 某一个元素出现的次数 extend() 在当前列表中 将传入的其他序列的元素添加在表尾…

养猫必看!毛发护理秘籍,猫粮选择大揭秘!

亲爱的猫友们,我们都知道,猫咪的毛发是它们健康与美丽的象征。选择一款合适的猫粮,对于猫咪的毛发健康至关重要。那么,如何根据猫咪的毛发情况来选择合适的猫粮呢?接下来,就让我来为你详细解答吧&#xff0…

5.前后端分离

目录 一、前后端分离上传文件 1.在yml中设置port和localhost 2.如何使用postman测试上传文件的接口 二、如何导出excel文件 ​编辑1.在pom.xml中导包 2.在实体类中给每个字段添加注解,导出表格时,列名将会改为对应的中文 3.controller中方法的具体…

Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案

原文首发链接:Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案 大家好,我是码农先森。 引言 这次实现音视频实时通信的方案是基于 WebRTC 技术的,它是一种点对点的通信技术,通过浏览器之间建立对等连接,实现音频…

4.Labview簇、变体与类(上)

在Labview中,何为簇与变体,何为类?应该如何理解?具体有什么应用场景? 本文基于Labview软件,独到的讲解了簇与变体与类函数的使用方法和场景,从理论上讲解其数据流的底层概念,从实践上…

CSS基础之伪元素选择器(如果想知道CSS的伪元素选择器知识点,那么只看这一篇就足够了!)

前言:我们已经知道了在CSS中,选择器有基本选择器、复合选择器、伪类选择器、那么选择器学习完了吗?显然是没有的,这篇文章讲解最后一种选择器——伪元素选择器。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我…

如何把npm切换成yarn管理项目

1.删掉项目中package-lock.json和依赖包 这一步手动删掉就好 2.全局安装yarn npm install -g yarn 3.可以开始执行yarn install安装依赖 1)执行yarn init 这一步是修改npm生成的package.json文件,可能会遇到这个问题: 这个查了一下是有…

cesium primitive 移动 缩放 旋转 矩阵

旋转参考:cesium 指定点旋转rectangle Primitive方式 矩阵篇-CSDN博客 平移参考:cesium 调整3dtiles的位置 世界坐标下 相对坐标下 平移矩阵-CSDN博客 一、primitive方式添加polygon let polygonInstance new Cesium.GeometryInstance({geometry: Ce…

智能商品计划系统如何提升鞋服零售品牌的竞争力

国内鞋服零售企业经过多年的发展,已经形成了众多知名品牌,然而近年来一些企业频频受到库存问题的困扰,这一问题不仅影响了品牌商自身,也给长期合作的经销商带来了困扰。订货会制度在初期曾经有效地解决了盲目生产的问题&#xff0…

【python】flask结合SQLAlchemy,在视图函数中实现对数据库的增删改查

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

C++11(下篇)

文章目录 C111. 模版的可变参数1.1 模版参数包的使用 2. lambda表达式2.1 Lambda表达式语法捕获列表说明 2.2 lambda的底层 3. 包装器3.1 function包装器3.2 bind 4. 线程库4.1 thread类4.2 mutex类4.3 atomic类4.4 condition_variable类 C11 1. 模版的可变参数 C11支持模版的…

初学若依笔记

初学若依 下载ruoyi(以前后端分离板为例) https://ruoyi.vip/ 部署 安装mysql安装redis将数据库和redis配置到若依 配置文件为 ruoyi-admin\src\main\resource\application-druid.yml 运行 略 开发自己的功能 创建模块 为了不影响原有功能,创建一个模块写自…

[AI]-(第0期):认知深度学习

深度学习是一种人工智能(AI)方法,用于教计算机以受人脑启发的方式处理数据。 深度学习模型可以识别图片、文本、声音和其他数据中的复杂模式,从而生成准确的见解和预测。 您可以使用深度学习方法自动执行通常需要人工智能完成的…

深入理解大语言模型微调技术

一、概念解析 1、什么是微调(Fine-tuning)? 大模型微调,也称为Fine-tuning,是指在已经预训练好的大型语言模型基础上(一般称为“基座模型”),使用特定的数据集进行进一步的训练&am…

pandas基本用法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas的数据结构1、一维数组pd.Series1.1 pd.Series(data,index,dtype)示例1:不定义index示例2:自定义inde…