白骑士的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);     // 输出1

ptr++;

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.mfbz.cn/a/772992.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Generative Modeling by Estimating Gradients of the Data Distribution

Generative Modeling by Estimating Gradients of the Data Distribution 本文介绍宋飏提出的带噪声扰动的基于得分的生成模型。首先介绍基本的基于得分的生成模型的训练方法&#xff08;得分匹配&#xff09;和采样方法&#xff08;朗之万动力学&#xff09;。然后基于流形假…

2024 年 亚太赛 APMCM (B题)中文赛道国际大学生数学建模挑战赛 |洪水灾害数据分析 | 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题&#xff01; 完整内容可以在文章末尾领取&#xff01; 该段文字…

HTML内容爬取:使用Objective-C进行网页数据提取

网页爬取简介 网页爬取&#xff0c;通常被称为网络爬虫或爬虫&#xff0c;是一种自动浏览网页并提取所需数据的技术。这些数据可以是文本、图片、链接或任何网页上的元素。爬虫通常遵循一定的规则&#xff0c;访问网页&#xff0c;解析页面内容&#xff0c;并存储所需信息。 …

自动化立体仓库出入库能力及堆垛机节拍

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载 自动化立体仓库的出入库能力、堆垛机节拍以…

用720云搭建数字孪生VR智慧安防系统,赋能安防升级!

“安全防范"一直是我国城镇化发展进程中重点关注的工作板块&#xff0c;随着时代发展需求与科技的日新月异&#xff0c;安防行业正在积极融合VR3D数字孪生技术&#xff0c;升级安防数字基础设施和安防产品服务创新。 今年2月&#xff0c;《数字中国建设整体布局规划》的出…

Pycharm的终端(Terminal)中切换到当前项目所在的虚拟环境

1.在Pycharm最下端点击终端/Terminal, 2.点击终端窗口最上端最右边的∨&#xff0c; 3.点击Command Prompt&#xff0c;切换环境&#xff0c; 可以看到现在环境已经由默认的PS(Window PowerShell)切换为项目所使用的虚拟环境。 4.更近一步&#xff0c;如果想让Pycharm默认显示…

macOS使用Karabiner-Elements解决罗技鼠标G304连击、单击变双击的故障

记录一下罗技鼠标G304单击变双击的软件解决过程和方案&#xff08;适用于macOS&#xff0c; 如果是Windows&#xff0c;使用AutoHotKey也有类似解决办法、方案&#xff0c;改日提供&#xff09;&#xff1a; 背景&#xff1a;通过罗技Logitech G HUB软件对罗技的游戏鼠标侧键b…

1-4 NLP发展历史与我的工作感悟

1-4 NLP发展历史与我的工作感悟 主目录点这里 第一个重要节点&#xff1a;word2vec词嵌入 能够将无限的词句表示为有限的词向量空间&#xff0c;而且运算比较快&#xff0c;使得文本与文本间的运算有了可能。 第二个重要节点&#xff1a;Transformer和bert 为预训练语言模型发…

2024 世界人工智能大会暨人工智能全球治理高级别会议全体会议在上海举办,推动智能向善造福全人类

2024 年 7 月 4 日&#xff0c;2024 世界人工智能大会暨人工智能全球治理高级别会议-全体会议在上海世博中心举办。联合国以及各国政府代表、专业国际组织代表&#xff0c;全球知名专家、企业家、投资家 1000 余人参加了本次会议&#xff0c;围绕“以共商促共享&#xff0c;以善…

搜维尔科技:如何使用 SenseGlove Nova 加速手部运动功能的恢复

District XR 的VR 培训 5 年多来&#xff0c;District XR 一直在为最大的工业公司创建 VR 和 AR 项目。 客户&#xff1a;District XR 客户代表&#xff1a;尼古拉沃尔科夫 他的角色&#xff1a;District XR 首席执行官 面临解决的挑战 该公司正在寻找一种方法来加速身体伤…

JavaScript——while类型

目录 任务描述 相关知识 while类型 编程要求 任务描述 质数的定义如下&#xff1a;大于1的自然数&#xff0c;且除了1和本身外没有别的因数。如2、3、5、7。 本关任务&#xff1a;利用循环结构求质数的和。 相关知识 在选择结构中&#xff0c;条件会被测试一次&#xff…

JAVA进阶学习10

文章目录 一、创建不可变集合二、Stream流2.1 Stream流的获取2.1 Stream流的中间方法2.2 Stream流的终结方法 一、创建不可变集合 意义&#xff1a;如果一个集合中的数据在复制或使用过程中不能修改&#xff0c;或者被其他对象调用时不能改变内部数据&#xff0c;即增加数据的安…

【靶机实战】Apache Log4j2命令执行漏洞复现

# 在线靶场 可以通过访问极核官方靶场开启靶机实验&#xff1a;极核靶场 -> 漏洞复现靶场 -> Log4j2-RCE 原文&#xff1a;【靶机实战】Apache Log4j2命令执行漏洞复现 - 极核GetShell (get-shell.com) # 简介 Apache Log4j2 是一个广泛使用的 Java 日志记录库&#…

C++初学者指南-4.诊断---基础:警告和测试

C初学者指南-4.诊断—基础知识&#xff1a;警告和测试 文章目录 C初学者指南-4.诊断---基础知识&#xff1a;警告和测试1. 术语和技术记住&#xff1a;使用专用类型&#xff01; 2.编译器警告Gcc/CLang 编译器选项MS Visual Studio 编译器选项 3.断言运行时断言静态断言&#x…

系统架构设计师——计算机体系结构

分值占比3-4分 计算机硬件组成 计算机硬件组成主要包括主机、存储器和输入/输出设备。 主机&#xff1a;主机是计算机的核心部分&#xff0c;包括运算器、控制器、主存等组件。运算器负责执行算术和逻辑运算&#xff1b;控制器负责协调和控制计算机的各个部件&#xff1b;主存…

react+ts+antd项目搭建

前言&#xff1a; 基于ts语言创建react项目&#xff0c;node版本是v16.14.2 一、 脚手架创建项目 全局安装 npm install -g creacte-react-app创建项目file-management&#xff0c;ts需要添加–template typescript npx create-react-app file-management --template typesc…

如何搭建10万个H100 GPU的集群:电力、并行化、网络拓扑与成本优化

引言 在现代人工智能的发展中&#xff0c;构建大规模GPU集群是提升计算能力的关键手段。今天我们探讨如何搭建一个包含10万个H100 GPU的集群。这个项目不仅涉及巨大的资本支出&#xff0c;还面临电力供应、并行化处理、网络拓扑结构以及可靠性和恢复等多方面的挑战。通过深入分…

天命奇御下载

解压码/安装码 615634 天翼&#xff1a;https://cloud.189.cn/t/qAjmAnIB3eIv 链接: https://pan.baidu.com/s/1rArV_Q_pB-9U4kEDtWf_gQ 提取码: igaq 天命奇御/官方中文/整合V.2.3DLC伏虎迷蹤/完美学习版下载地址&#xff1a; 点击下载 原始地址:https://www.aiwanba.net/post…

在RT-Thread-Studio中添加arm_math库

1.在CMSIS\Lib\GCC中找到对应的库&#xff0c;如本文使用的libarm_cortexM4lf_math.a。将库拷贝到工程&#xff0c;并做如下图设置。搜索路径为库文件在项目中的实际位置。 2.将CMSIS\DSP\Include下的文件复制到工程目录中&#xff0c;并添加包含路径 3.添加宏定义&#xff0c…