【c语言指针详解】复杂数据结构的指针用法

目录

一、动态内存分配

1.1 使用malloc和free函数进行内存的动态分配和释放

1.2 内存泄漏和野指针的概念和解决方法

二、复杂数据结构的指针用法

2.1 结构体指针和成员访问操作符

2.2 指针数组和指向指针的指针

2.2.1 指针数组

2.2.2 指向指针的指针

2.3 动态内存分配与结构体指针的结合使用​​​​​​​


🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。

🎁欢迎大家给我点赞👍、收藏⭐️,并在留言区📝与我互动,这些都是我前进的动力!

🌟我的格言:森林草木都有自己认为对的角度🌟。

一、动态内存分配

1.1 使用malloc和free函数进行内存的动态分配和释放

malloc 函数用于在运行时动态分配内存。它接受一个参数,表示需要分配的内存大小(以字节为单位),并返回一个指向分配内存的指针。如果分配成功,则返回的指针指向一块连续的、未初始化的内存区域;如果分配失败,则返回一个特殊的空指针(NULL)。

free 函数用于释放之前通过 malloc 或者类似函数动态分配的内存。它接受一个参数,表示需要释放的内存区域的起始地址。调用 free 函数将释放指定内存区域,这样释放的内存可以被重新分配给其他部分。

示例代码:

#include <stdio.h>
#include <stdlib.h>int main() {int* ptr;// 动态分配内存ptr = (int*)malloc(5 * sizeof(int));if (ptr == NULL) {printf("内存分配失败\n");exit(1); // 终止程序}// 使用分配的内存for (int i = 0; i < 5; i++) {ptr[i] = i + 1;}// 打印数组的值for (int i = 0; i < 5; i++) {printf("%d ", ptr[i]);}printf("\n");// 释放内存free(ptr);return 0;
}

输出结果如下:

上面的代码首先使用 malloc 函数动态分配了一个数组,然后使用循环给数组赋值。最后打印数组的值,并使用 free 函数释放了之前分配的内存空间。

1.2 内存泄漏和野指针的概念和解决方法

内存泄漏指的是分配的内存空间在不再使用时没有被释放,导致该内存无法被重新分配使用,并且随着程序运行时间的增长,已分配但未释放的内存会不断增加,最终导致程序崩溃。

可以使用 malloc 和 free 函数进行内存管理,为避免内存泄漏,释放内存的方法是在不再需要内存时调用 free 函数将其释放。

野指针则是指指向已释放或未分配内存空间的指针。

野指针的出现通常是由于对已释放的内存空间进行操作,或者未初始化指针的值导致指针指向未知的内存空间。使用野指针可能导致程序崩溃或者产生不可预测的结果。为避免野指针,应该在使用指针之前对其进行初始化,并在释放内存之后将指针置为 NULL

示例代码:

#include <stdio.h>
#include <stdlib.h>int main() {// 内存泄漏int* ptr = (int*)malloc(sizeof(int));if (ptr != NULL) {*ptr = 10;}// 需要释放内存free(ptr);// 野指针int* ptr2 = NULL;ptr2 = (int*) malloc( sizeof(int) );if ( ptr2 != NULL ) {*ptr2 = 20;// 在释放完内存后,应该将指针赋值为 NULL,避免出现野指针问题free(ptr2);ptr2 = NULL;}return 0;
}

二、复杂数据结构的指针用法

2.1 结构体指针和成员访问操作符

在 C 语言中,结构体是一种自定义数据类型,可以将不同类型的数据组合在一起,形成一个整体的数据类型。

结构体指针可以指向结构体变量,也可以指向动态分配的结构体内存空间,使用结构体指针可以方便地对结构体成员进行操作。

成员访问操作符有两种,一种是点操作符号 .,另一种是箭头操作符号 -> 。点操作符号用于访问结构体变量的成员,箭头操作符号则用于访问结构体指针指向的结构体变量的成员。

示例代码:

#include <stdio.h>
#include <string.h>// 定义一个结构体类型
struct Student {char name[20];int age;float score;
};int main() {// 定义一个结构体变量struct Student stu1 = {"Tom", 18, 90.5};// 定义一个结构体指针,指向结构体变量struct Student *p = &stu1;// 使用成员访问操作符号点操作符访问结构体变量的成员printf("%s %d %.2f\n", stu1.name, stu1.age, stu1.score);// 使用成员访问操作符号箭头操作符访问结构体指针指向的结构体变量的成员printf("%s %d %.2f\n", p->name, p->age, p->score);// 修改结构体指针指向的结构体变量的成员strcpy(p->name, "Jim");p->age = 19;p->score = 88.5;// 使用成员访问操作符号点操作符访问结构体变量的成员printf("%s %d %.2f\n", stu1.name, stu1.age, stu1.score);// 使用成员访问操作符号箭头操作符访问结构体指针指向的结构体变量的成员printf("%s %d %.2f\n", p->name, p->age, p->score);return 0;
}

输出结果如下:

在上面的代码中,我们首先定义了一个结构体类型 Student,然后定义了一个 Student 类型的结构体变量 stu1 和一个指向 stu1 的结构体指针 p。接着,我们使用点操作符号和箭头操作符号分别访问了结构体变量和结构体指针指向的结构体变量的成员,并修改了结构体指针指向的结构体变量的成员。

2.2 指针数组和指向指针的指针

2.2.1 指针数组

指针数组是一个数组,其元素都是指针类型。每个指针指向一个特定类型的对象或单元。可以通过索引来访问数组中的每个指针,并使用指针进一步操作对应的对象或单元。

示例代码:

#include <stdio.h>int main() {int num1 = 10, num2 = 20, num3 = 30;int* ptrArr[3];  // 声明一个指针数组ptrArr[0] = &num1;  // 指针数组的第一个元素指向 num1ptrArr[1] = &num2;  // 指针数组的第二个元素指向 num2ptrArr[2] = &num3;  // 指针数组的第三个元素指向 num3for (int i = 0; i < 3; i++) {printf("Element %d: %d\n", i, *(ptrArr[i]));}return 0;
}

输出结果如下:

在上述示例中,我们定义了一个指针数组 ptrArr,它有 3 个元素,每个元素都是 int 类型的指针。我们将 num1num2 和 num3 的地址依次赋给指针数组的元素,然后通过指针数组访问并打印对应的值。

2.2.2 指向指针的指针

指向指针的指针是一个指针,它存储了指针的地址。通过指向指针的指针可以间接地访问并修改指针所指向的变量。

示例代码:

#include <stdio.h>int main() {int num = 10;int* ptr = &num;int** ptrPtr = &ptr;  // 声明一个指向指针的指针printf("Value of num: %d\n", num);printf("Value of *ptr: %d\n", *ptr);printf("Value of **ptrPtr: %d\n", **ptrPtr);return 0;
}

输出结果如下:

在上述示例中,我们定义了一个指针 ptr,它存储了 num 的地址。然后,我们定义了一个指向指针的指针 ptrPtr,它存储了 ptr 的地址。通过 **ptrPtr,我们可以间接地访问并输出 num 的值。

2.3 动态内存分配与结构体指针的结合使用

可以使用动态内存分配和结构体指针的结合使用,来动态创建和操作结构体对象。这种组合可以在运行时动态地分配内存空间以存储结构体对象,并使用结构体指针来访问和操作这些对象。

示例代码:

#include <stdio.h>
#include <stdlib.h>typedef struct {int id;char name[20];
} Student;int main() {int numStudents;printf("Enter the number of students: ");scanf("%d", &numStudents);// 动态分配内存以存储指定数量的结构体对象Student* students = (Student*)malloc(numStudents * sizeof(Student));// 输入每个学生的信息for (int i = 0; i < numStudents; i++) {printf("Enter information for student %d:\n", i + 1);printf("ID: ");scanf("%d", &(students[i].id));printf("Name: ");scanf("%s", students[i].name);}// 输出每个学生的信息printf("\nStudent Information:\n");for (int i = 0; i < numStudents; i++) {printf("ID: %d, Name: %s\n", students[i].id, students[i].name);}// 释放动态分配的内存free(students);return 0;
}

在上述示例中,我们首先通过 malloc 函数动态分配了足够的内存空间来存储指定数量的 Student 结构体对象。然后,我们使用结构体指针 students 来访问和操作每个结构体对象的成员。通过输入每个学生的信息并输出学生信息,展示了动态分配内存和结构体指针的结合使用的一个简单例子。

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

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

相关文章

Vue项目解决van-calendar 打开下拉框显示空白(白色),需滑动一下屏幕,才可正常显示

问题描述&#xff0c;如图 ipad(平板&#xff09;或者 H5移动端引入Vant组件的日历组件&#xff08;van-calendar&#xff09;&#xff0c;初始化显示空白&#xff0c;需滚动一下屏幕&#xff0c;才可正常显示 解决方法 需在van-calendar上绑定open"openCalendar"事件…

应用层自定义协议

文章目录 一、前言二、应用层自定义协议三、通用协议格式3.1 xml3.2 josn3.3 protobuffer 后端开发必须掌握的知识点&#xff01; 一、前言 应用层主要是干嘛的呢&#xff1f;&#xff1f; 应用层协议定义了应用程序之间通信的规则和标准。定义了数据的格式、数据交换的标准和…

第74讲:MySQL数据库InnoDB存储引擎事务:Redo Log与Undo Logo的核心概念

文章目录 1.InnoDB引擎中的逻辑存储结构2.事务的基本概念3.Redo log的核心概念3.1.什么是Redo log3.2.如果没有redo log面临的问题3.3.使用redo log之后是怎样的流程 4.Undo log的核心概念 1.InnoDB引擎中的逻辑存储结构 InnoDB存储引擎的逻辑结构分为以下几层&#xff1a; Ta…

【链表Linked List】力扣-83 删除排序链表中的重复元素

目录 题目描述 解题过程 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入&#xff1…

Python源码17:使用海龟画图turtle画五星红旗

turtle模块是一个Python的标准库之一&#xff0c;它提供了一个基于Turtle graphics的绘图库。Turtle graphics是一种流行的绘图方式&#xff0c;它通过控制一个小海龟在屏幕上移动来绘制图形。 turtle模块可以让您轻松地创建和控制海龟图形&#xff0c;从而帮助您学习Python编…

python基于轻量级卷积神经网络模型ShuffleNetv2开发构建辣椒病虫害图像识别系统

轻量级识别模型在我们前面的博文中已经有过很多实践了&#xff0c;感兴趣的话可以自行移步阅读&#xff1a; 《移动端轻量级模型开发谁更胜一筹&#xff0c;efficientnet、mobilenetv2、mobilenetv3、ghostnet、mnasnet、shufflenetv2驾驶危险行为识别模型对比开发测试》 《基…

你的手机注册了多少互联网账号?赶快通过这个功能查询一下吧!

一键查询手机号绑定&#xff01;你的手机注册了多少互联网账号&#xff1f;赶快查询一下吧&#xff01; 你知道你名下的手机号绑定了多少互联网账号吗&#xff1f; 怎么查询手机号绑定了什么账号呢&#xff1f; ...... 不用担心 一键查询手机号绑定的帐号功能来了&#xff01; …

制造业企业如何建立智能工厂

今天就聊聊企业智能工厂的打造&#xff0c;企业想实现数字化转型建立智能工厂&#xff0c;就需要先建设数字化车间&#xff0c;可以说数字化车间是建设智能工厂的重要一环&#xff0c;智能工厂的基础是数字化车间。数字化车间可以实现企业生产过程中车间计划调度、工艺执行管理…

食品厂ERP有哪几种?食品厂ERP软件哪个操作简单

食品安全问题是近些年备受消费者和企业关注的行业&#xff0c;而食品安全管理涉及原材料、配方、车间、工艺、设备、包装、仓储、保质期等多个方面&#xff0c;因而各个业务部门之间的协同问题就显得颇为重要。 想要提升采购、保质期、库龄分析、财务、订单、原材料、仓储等各…

Pycharm修改文件默认打开方式 + CSV Editor插件使用

1、File —> Settings —> Editor —> File Types 然后将*csv添加到最上面 在plugins中下载插件&#xff0c;CSV Editor 备注&#xff1a;不在上一步的“File Types”中将*.csv设置为CSV格式&#xff0c;插件是不起作用的 就可以使用了

十二、FreeRTOS之FreeRTOS任务相关API函数

本节需要掌握以下内容&#xff1a; 1&#xff0c;FreeRTOS任务相关API函数介绍&#xff08;熟悉&#xff09; 2&#xff0c;任务状态查询API函数实验&#xff08;掌握&#xff09; 3&#xff0c;任务时间统计API函数实验&#xff08;掌握&#xff09; 4&#xff0c;总结 一…

【Docker】从零开始:15.搭建亿级数据Redis集群之哈希算法概念

【Docker】从零开始&#xff1a;15.搭建亿级数据Redis集群之哈希算法概念篇 概述一般业界的3种解决方案1.哈希取余分区优点&#xff1a;缺点&#xff1a; 2.一致性哈希算法分区背景目的原理一致性哈希环节点映射key落到服务器的落键规则 优点容错性扩展性 缺点 3.哈希槽分区背景…

家用超声波清洗机哪个牌子好?一起来看、值得推荐超声波清洗机

家用超声波清洗机可以干嘛呢&#xff1f;最常见的就是来清洗眼镜。眼镜党朋友应该经常接触超声波清洗机&#xff0c;它常出现在眼镜店中&#xff0c;眼镜店老板帮顾客清洗眼镜&#xff1b;也会出现在工业领域、医疗领域等&#xff0c;超声波清洗机使用范围还是挺广的&#xff0…

微信小程序 分享的两种方式:菜单级和按钮级

按钮级 在使用微信小程序的时候&#xff0c;我们可能会设计到一些视频的一些分享等&#xff0c;那么视频分享也分为两种方式,例如下图&#xff0c;当我们点击的时候&#xff0c;进行一个转发分享的一个操作 那么在原先代码的基础上&#xff0c;我们需要在原先代码的基础上butt…

Unity中动态合批

文章目录 前言一、动态合批的规则1、材质相同是合批的前提&#xff0c;但是如果是材质实例的话&#xff0c;则一样无法合批。2、支持不同网格的合批3、动态合批需要网格支持的顶点条件二、我们导入一个模型并且制作一个Shader&#xff0c;来测试动态合批1、我们选择模型的 Mesh…

电商API接口开发和接入说明{包含淘宝/京东/拼多多/抖音}

“为什么改了这个没告诉我” “实际功能和文档上说的不一样啊”。 这些话大家在进行电商API接口开发时&#xff0c;想必耳朵都听出老茧了。 真不是故意的&#xff0c;有时候任务比较急&#xff0c;就先改了代码&#xff0c;想着以后再同步文档&#xff0c;然后就给忘了。 项…

在Pycharm中使用GitHub的方法步骤

文章目录 前言一、配置Pycharm二、建立远程仓库并提交代码三、在github中查看上传的新仓库四、使用pycharm克隆github仓库五、在pycharm内进行git的相关操作关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源…

【C++】三大特性 --- 继承的详细讲解

目录 1.继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6.继承与静态成员 7.复杂的菱形继承及菱形虚…

从0到1构建智能分布式大数据爬虫系统

文章目录 1. 写在前面2. 数据获取挑战3. 基础架构4. 爬取管理5. 数据采集6. 增量与去重设计 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐…

win10的系统下实现SUSTechPOINTS环境搭建

** win10的 标题系统下实现SUSTechPOINTS环境搭建 ** 参考文档&#xff1a; doc/install_from_source.md 张金来/SUSTechPOINTS - Gitee.com 在win10的系统下搭建**SUSTechPOINTS环境 1 克隆代码 git clone https://github.com/naurril/SUSTechPOINTS2 安装环境 2.1 创…