白骑士的C语言教学进阶篇 2.2 指针与内存管理

系列目录

上一篇:白骑士的C语言教学进阶篇 2.1 数组与字符串

        在本节中,我们将深入探讨C语言中的指针与内存管理,包括指针的基础知识、指针与数组的关系,以及动态内存分配。指针是C语言中强大而灵活的工具,正确理解和使用指针对编写高效和健壮的C程序至关重要。

指针基础

        指针是存储另一个变量地址的变量。在C语言中,指针的使用非常广泛,尤其在动态内存管理和数据结构操作中。

指针的定义与初始化

        可以使用以下语法定义指针变量:

数据类型 *指针名;

        例如:

int *p;

        指针变量存储的是另一个变量的地址,可以使用取地址操作符‘&‘获取变量的地址并赋值给指针,例如:

int a = 10;
int *p = &a;

        可以通过解引用操作符 ‘*‘ 访问指针所指向的变量,例如:

printf("Value of a: %d\n", *p);  // 输出10

指针的操作

  • 获取变量地址:‘&‘;
  • 解引用指针:‘*‘;
  • 指针的算术运算:指针可以进行加减运算,例如移动到数组的下一个元素。

        例如:

int arr[3] = {1, 2, 3};
int *ptr = arr;printf("First element: %d\n", *ptr);     // 输出1ptr++;printf("Second element: %d\n", *ptr);    // 输出2

指针与数组

        在C语言中,数组名实际上是一个指向数组首元素的指针,因此数组和指针有很多相似之处。

数组名与指针

        数组名可以作为指针使用,指向数组的第一个元素,例如:

int arr[3] = {1, 2, 3};
int *ptr = arr;printf("First element: %d\n", *ptr);  // 输出1

        访问数组元素的方式可以通过指针算术运算实现,例如:

for (int i = 0; i < 3; i++) {printf("Element %d: %d\n", i, *(ptr + i));
}

指针数组与数组指针

        指针数组:存储指针的数组,例如:

int *arr[3];
int a = 1, b = 2, c = 3;arr[0] = &a;
arr[1] = &b;
arr[2] = &c;

        数组指针:指向数组的指针,例如:

int (*ptr)[3];
int arr[3] = {1, 2, 3};ptr = &arr;

动态内存分配

        静态数组在编译时确定大小,而动态内存分配允许在运行时分配和释放内存,这使得程序更加灵活。

malloc与free

        ‘malloc‘ 函数用于在堆上分配指定字节数的内存,并返回指向分配内存的指针。‘free‘ 函数用于释放动态分配的内存。例如:

int *p = (int *)malloc(3 * sizeof(int));if (p == NULL) {printf("Memory allocation failed\n");return 1;
}p[0] = 1;
p[1] = 2;
p[2] = 3;for (int i = 0; i < 3; i++) {printf("Element %d: %d\n", i, p[i]);
}free(p);

calloc

        ‘calloc‘ 函数类似于 ‘malloc‘,但它会初始化分配的内存为零,例如:

int *p = (int *)calloc(3, sizeof(int));if (p == NULL) {printf("Memory allocation failed\n");return 1;
}for (int i = 0; i < 3; i++) {printf("Element %d: %d\n", i, p[i]);
}free(p);

realloc

        ‘realloc‘ 函数用于重新调整之前分配的动态内存大小。

int *p = (int *)malloc(2 * sizeof(int));if (p == NULL) {printf("Memory allocation failed\n");return 1;
}p[0] = 1;
p[1] = 2;
p = (int *)realloc(p, 3 * sizeof(int));if (p == NULL) {printf("Memory reallocation failed\n");return 1;
}p[2] = 3;for (int i = 0; i < 3; i++) {printf("Element %d: %d\n", i, p[i]);
}free(p);

示例代码

        以下是一个综合示例,展示了指针的基本操作、指针与数组的关系以及动态内存分配的使用:

#include <stdio.h>
#include <stdlib.h>int main() {// 指针基础int a = 10;int *p = &a;printf("Address of a: %p\n", p);printf("Value of a: %d\n", *p);// 指针与数组int arr[3] = {1, 2, 3};int *ptr = arr;for (int i = 0; i < 3; i++) {printf("Element %d: %d\n", i, *(ptr + i));}// 动态内存分配int *dynamicArr = (int *)malloc(3 * sizeof(int));if (dynamicArr == NULL) {printf("Memory allocation failed\n");return 1;}dynamicArr[0] = 1;dynamicArr[1] = 2;dynamicArr[2] = 3;for (int i = 0; i < 3; i++) {printf("Dynamic array element %d: %d\n", i, dynamicArr[i]);}free(dynamicArr);return 0;
}

结论

        通过本节的学习,你已经了解了C语言中指针与内存管理的基本概念和使用方法,包括指针的定义与操作、指针与数组的关系,以及动态内存分配。指针是C语言中非常强大且重要的特性,正确使用指针不仅能提高程序的效率,还能增强代码的灵活性和可扩展性。在接下来的章节中,我们将继续深入探讨C语言中的面向对象编程、模板和标准模板库等高级主题,进一步提升编程技能。

下一篇:白骑士的C语言教学进阶篇 2.3 结构体与联合体​​​​​​​

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

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

相关文章

英语学习交流小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;每日打卡管理&#xff0c;备忘录管理&#xff0c;学习计划管理&#xff0c;学习资源管理&#xff0c;论坛交流 微信端账号功能包括&#xff1a;系统首页&#xff0c;学习资源&…

C++基础(八):类和对象 (下)

经过前面的学习&#xff0c;我们已经翻过了两座大山&#xff0c;类和对象入门知识就剩下这一讲了&#xff0c;加油吧&#xff0c;少年&#xff01; 目录 一、再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表&#xff08;理解&#xff09; 1.3 explicit关键字&#xff08;C…

【Java探索之旅】继承概念_语法_父类的成员访问

文章目录 &#x1f4d1;前言一、继承1.1 继承的概念1.2 继承语法1.3 继承发生后 二、父类的访问2.1 父类成员变量访问2.2 父类成员方法访问 &#x1f324;️全篇总结 &#x1f4d1;前言 在面向对象编程中&#xff0c;继承是一种重要的概念&#xff0c;它允许我们创建一个类&…

html的作业

目录 作业题目 1.用户注册 A图 B代码 2.工商银行电子汇款单 A图 B代码 3.李白诗词 A图 B代码 4.豆瓣电影 A图 B代码 学习产出&#xff1a; 作业题目 1.用户注册 A图 B代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset&qu…

Gitblit的基本操作和技巧

Gitblit是一个开源的、轻量级的Git服务器&#xff0c;使用Java编写&#xff0c;能够提供简单的Web界面来浏览Git仓库、管理用户和仓库权限&#xff0c;以及进行一些基本的Git操作。 安装时最重要的是配置gitblit.properties文件以自定义Gitblit的行为&#xff0c;例如更改端口…

(6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析

目录 前言1. DataFrame 简介2. DataFrame的特点3. DataFrame的创建3.1 使用字典创建DataFrame3.2 使用列表的列表&#xff08;或元组&#xff09;创建DataFrame3.3 使用NumPy数组创建DataFrame3.4 使用Series构成的字典创建DataFrame3.5 使用字典构成的字典创建DataFrame 4. 从…

探索Vue.js:构建高效前端应用的现代框架

前言 在前端开发的广阔天地中&#xff0c;Vue.js以其轻量级、易上手和强大的生态系统迅速崛起&#xff0c;成为众多开发者的首选框架之一。无论是构建小型个人项目还是大型企业级应用&#xff0c;Vue.js都能提供灵活且高效的解决方案。本文将带你深入了解Vue.js的核心概念、优…

Java技术栈总结:Redis篇

一、数据类型 Redis 自身是一个 Map&#xff0c;其中的所有数据均采用“key:value”的形式存储。 数据类型指的是存储的数据的类型&#xff0c;即 value 部分的类型&#xff0c;key 的部分只能是字符串。 value 部分的数据类型&#xff1a;<String、List、Hash、Set、Zse…

MSPM0G3507——编码器控制速度

绿色设置的为目标值100&#xff0c;红色为编码器实际数据 。 最后也是两者合在了一起&#xff0c;PID调试成功。 源码直接分享&#xff0c;用的是CCStheia&#xff0c;KEIL打不开。大家可以看一下源码的思路&#xff0c;PID部分几乎不用改 链接&#xff1a;https://pan.baid…

S32DS S32 Design Studio for S32 Platform 3.5 代码显示行号与空白符

介绍 NXP S32DS&#xff0c;全称 S32 Design Studio&#xff0c;s32 系列芯片默认使用 S32 Design Studio for S32 Platform 作为 IDE 集成开发环境&#xff0c;当前版本 S32 Design Studio for S32 Platform 3.5&#xff0c;IDE 可以简称 s32DS 使用 S32DS&#xff0c;可以认…

YOLOv10涨点改进|引入BoTNet、Ghost与CA注意力机制,打造高效轻量级检测器

📚 专栏地址:《YOLOv10算法改进实战》 👉 独家改进,对现有YOLOv10进行二次创新,提升检测精度,适合科研创新度十足,强烈推荐 🌟 统一使用 YOLOv10 代码框架,结合不同模块来构建不同的YOLO目标检测模型。 💥 本博客包含大量的改进方式,降低改进难度,改进点包含【B…

Qt 网络编程 网络信息获取操作

学习目标&#xff1a;网络信息获取操作 前置环境 运行环境:qt creator 4.12 学习内容 一、Qt 网络编程基础 Qt 直接提供了网络编程模块,包括基于 TCP/IP 的客户端和服务器相关类,如 QTcpSocket/QTcpServer 和 QUdpSocket,以及实现 HTTP、FTP 等协议的高级类,如 QNetworkRe…

Linux搭建Socks5网络代理服务器,Centos 8 系统

一、目的用途 用于网络代理转发请求&#xff0c;隐藏真实的请求ip地址&#xff0c;或者用于绕过网络限制的目标服务器&#xff0c;将自己的访问请求到代理服务器&#xff0c;通过网络代理服务器将请求转发到目标服务器 二、安装Socks5前的准备 1、从官网下载ss5安装包&#xf…

【简单介绍下Memcached】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

Matlab自学笔记三十二:结构数组的连接、嵌套、引用变量值和访问字段值

1.结构数组的连接 结构数组必须具有相同的字段名才能连接&#xff0c;元素数目可以不同&#xff0c;某一元素添加字段&#xff0c;其他所有元素也具有了该字段&#xff0c;默认值为[]&#xff0c;程序示例如下&#xff1a; %创建3个结构数组student/stu/st student.xingming…

昇思25天学习打卡营第08天 | 模型训练

昇思25天学习打卡营第08天 | 模型训练 文章目录 昇思25天学习打卡营第08天 | 模型训练超参数损失函数优化器优化过程 训练与评估总结打卡 模型训练一般遵循四个步骤&#xff1a; 构建数据集定义神经网络模型定义超参数、损失函数和优化器输入数据集进行训练和评估 构建数据集和…

uniapp 去掉小数末尾多余的0

文章目录 在uniapp或者一般的JavaScript环境中&#xff0c;要去掉小数末尾的0&#xff0c;可以使用以下几种方法&#xff1a; 使用parseFloat()函数 let num 123.4500; let result parseFloat(num); console.log(result); // 输出: 123.45字符串处理 将数字转换为字符串&am…

24年沈阳教师招聘报名全流程(电脑版)

公开招聘1876名事业编制工作人员 报名时间&#xff1a;7月8日10:00至7月11日16:00&#xff1b; 报名网站&#xff1a;&#xff1a;沈阳市考试院 报名流程&#xff1a; 1.报名 ①登录沈阳市考试院填写报名信息&#xff0c;上传照片 本人近期免冠2寸正面电子证jian照片&#xff0…

深入解析HTTP与HTTPS协议及其应用

本套课在线学习视频&#xff08;网盘地址&#xff0c;保存到网盘即可免费观看&#xff09;&#xff1a; https://pan.quark.cn/s/519e660ca433 HTTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;安全超文本传输协议&#xff09;是互联网上用于数据传输的两种主…

接口依赖-动态参数+数据依赖的代码

怎么写测试用例 接口名:被依赖的返回值的jsonpath表达式&#xff0c;有几个依赖往后写就可以 代码 如果caseinfo里的getisdep等于yes&#xff0c;并且&#xff0c;depkey不为空 用正则解析 在testrun里增加判断 判断的内容是正则表达式&#xff0c;先去匹配&#xff0c;再去…