当前位置: 首页 > news >正文

高考数学97分,我的“数学直觉“比140分更好用:指针:内存的门牌号系统

目录

一.序言

二.数学直觉

三.核心概念

1.基础核心概念

1. 1.指针的本质

1.2. 指针的两大核心操作

1.3. 指针的类型

2.进阶核心概念

2.1. 指针与数组的关系

2.2. 指针的运算

2. 3. 多级指针

3.应用核心概念

3.1. 指针作为函数参数

3.2. 动态内存分配

3.3. 函数指针

4.安全核心概念

4.1. 空指针(NULL)

4.2. 野指针与悬空指针

4.3. 内存泄漏

四.代码实现

1. 指针基础操作

2. 数组与指针

3. 指针作为函数参数

4. 动态内存分配

5. 函数指针

6. 多级指针

五.最后总结


一.序言

大家好,我是你们的小洛。上一章我们讲了模块化封装的函数,这一节我们首先要知道的一个就是系统通过管理内存来实现对变量的操作,而变量只是内存的"代言人"。既然变量只是内存的'代言人',那我们如何绕过这个代言人,直接拿到内存的'门牌号'来操作呢?

二.数学直觉

首先我们要理解,系统再找变量的核心就是地址,系统识别不了变量名,他只能识别地址(变量名就像别人给你取的外号)所以通过变量名映射地址,系统通过地址来进行操作这个量。

如果我们把我们自己当做是一个系统,把学校的教学楼当做是一个程序,那么每一间教室就是内存空间,每一个门牌号就是这个内存的编号指针就是这个这个编号,我们在用到一个东西时,我们可以直接根据门牌号(指针)找这个教室,去这个教室找东西,我们也可以用指针变量先找到这间教室的门牌号(指针),再去根据门牌号找这个教室。

三.核心概念

1.基础核心概念


1. 1.指针的本质

  • 指针就是内存地址,指针变量就是存储地址的变量。

1.2. 指针的两大核心操作

  • 取地址(&) :获取变量的内存地址
  • 取值(*) :通过地址访问或修改数据,与&互为逆运算(*&p得到的是p指向的值,而非p本身)

1.3. 指针的类型

  • 指针类型决定了解引用时访问的内存大小
  • int* 访问4字节, char* 访问1字节

2.进阶核心概念

2.1. 指针与数组的关系

  • 数组名在表达式中通常退化为指向首元素的指针,但sizeof(arr)时仍是数组类型
  • arr[i] 等价于 *(arr + i)

2.2. 指针的运算

  • 指针加减:根据类型大小偏移地址
  • 指针比较:比较地址的大小关系

2. 3. 多级指针

  • 指向指针的指针( int** p )
  • 用于间接修改指针本身的值

3.应用核心概念

3.1. 指针作为函数参数

  • 实现"传引用"效果,修改外部变量
  • 避免大数据的复制,提高效率

3.2. 动态内存分配

  • malloc 分配堆内存,返回指针
  • 通过指针管理动态内存的生命周期

3.3. 函数指针

  • 指向函数的指针,存储函数的入口地址
  • 实现回调函数和动态调用

4.安全核心概念

4.1. 空指针(NULL)

  • 不指向任何有效内存的指针
  • 使用前应检查,避免程序崩溃

4.2. 野指针与悬空指针

  • 野指针:指向未分配或已释放的内存
  • 悬空指针:原指向的内存已释放,但指针仍保存旧地址

4.3. 内存泄漏

  • 动态分配的内存未释放
  • 导致内存资源浪费


四.代码实现

1. 指针基础操作

#include <stdio.h> int main() { int a = 10; int* p = &a; // 取地址 printf("a的值: %d\n", a); printf("a的地址: %p\n", &a); printf("p的值: %p\n", p); printf("*p的值: %d\n", *p); // 解引用 *p = 20; // 通过指针修改a的值 printf("修改后a的值: %d\n", a); return 0; } //a的值: 10 //a的地址: 0x7ffee6b1e76c //p的值: 0x7ffee6b1e76c //*p的值: 10 //修改后a的值: 20

2. 数组与指针

#include <stdio.h> int main() { int arr[5] = {1, 2, 3, 4, 5}; int* p = arr; // 数组名是首元素地址 printf("数组元素: "); for(int i = 0; i < 5; i++) { printf("%d ", *(p + i)); // 指针偏移访问 } printf("\n"); printf("数组元素: "); for(int i = 0; i < 5; i++) { printf("%d ", p[i]); // 指针下标访问 } printf("\n"); return 0; } //数组元素: 1 2 3 4 5 //数组元素: 1 2 3 4 5

3. 指针作为函数参数

#include <stdio.h> // 通过指针修改外部变量 void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } int main() { int x = 10, y = 20; printf("交换前: x=%d, y=%d\n", x, y); swap(&x, &y); printf("交换后: x=%d, y=%d\n", x, y); return 0; } //交换前: x=10, y=20 //交换后: x=20, y=10

4. 动态内存分配

#include <stdio.h> #include <stdlib.h> int main() { int n; printf("请输入数组大小: "); scanf("%d", &n); // 动态分配内存 int* arr = (int*)malloc(n * sizeof(int)); if(arr == NULL) { printf("内存分配失败\n"); return 1; } // 填充数据 for(int i = 0; i < n; i++) { arr[i] = i + 1; } // 输出数据 printf("动态数组: "); for(int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); // 释放内存 free(arr); return 0; } //请输入数组大小: 5 //动态数组: 1 2 3 4 5

5. 函数指针

#include <stdio.h> // 加法函数 int add(int a, int b) { return a + b; } // 乘法函数 int multiply(int a, int b) { return a * b; } int main() { // 函数指针 int (*operation)(int, int); // 指向加法函数 operation = add; printf("3 + 5 = %d\n", operation(3, 5)); // 指向乘法函数 operation = multiply; printf("3 * 5 = %d\n", operation(3, 5)); return 0; } //3 + 5 = 8 //3 * 5 = 15

6. 多级指针

#include <stdio.h> void modify_pointer(int** pp) { static int b = 200; *pp = &b; // 修改指针p本身 } int main() { int a = 100; int* p = &a; printf("修改前: *p = %d\n", *p); modify_pointer(&p); // 传递指针的地址 printf("修改后: *p = %d\n", *p); return 0; } //修改前: *p = 100 //修改后: *p = 200

五.最后总结

总的来说,指针就是这个内存的地址名,指针变量就是用来存放指针的。通过指针直接操作内存,就像直接修改游戏后台数据一样,比通过变量操作更加灵活,可以实现更多自定义功能,实现常规操作难以达到的效果。

下节预告:自定义数据类型:打包与复用

http://www.jsqmd.com/news/489433/

相关文章:

  • Java入门(类和对象)
  • C++编译期字符串加密
  • 小白从零开始勇闯人工智能:LangChain 入门指南(上)
  • 数据结构和算法之【递归】
  • C语言100篇:从入门到天花板 第19篇 静态变量static:修饰变量与函数的核心作用
  • 人工降AI vs 工具降AI:哪种方式更适合你的论文
  • 企业级openclaw本地私有化部署与云端部署的区别
  • 2026年降AI工具新手入门指南:第一次用选这3款不踩坑
  • 实验配置流水线:Hydra基本教程
  • MySQL的CRUD,约束,基本类型
  • 【脉宽调制DCDC功率变换学习笔记005】不连续导通模式(DCM)中的Buck变换器
  • 19、QTimer类(待补充)---------QT基础
  • 全屋智能不被 “网” 住[特殊字符] Home Assistant+cpolar 解锁远程控家新体验
  • 判断是不是素数题目
  • 2026年比较好的VR身心调试系统采购品牌推荐:VR身心调试系统解决方案/VR身心调试系统资质齐全热门公司推荐 - 行业平台推荐
  • 2026年口碑好的玻璃钢罐品牌推荐:玻璃钢防腐罐/储罐玻璃钢罐销售厂家推荐 - 行业平台推荐
  • 排序Java
  • 2026年降AI率一次过的工具有哪些?别再反复修改了
  • 2026年质量好的冷水塔工厂推荐:冷却水塔/方形冷却塔/玻璃钢冷却塔厂家选择指南 - 行业平台推荐
  • 面试趣事:陈千语的Java面试历险记
  • 2026年评价高的VR身心调试系统公司推荐:VR身心调试系统设备/VR身心调试系统资质齐全/VR身心调试系统解决方案推荐公司 - 行业平台推荐
  • 木马的排除与防护
  • 2026年热门的盐酸储罐厂家推荐:玻璃钢罐/玻璃钢贮罐/玻璃钢防腐罐公司口碑推荐 - 行业平台推荐
  • 064远程教育网站系统-springboot+vue
  • 专业术语简介【三】降熵、第一性原理
  • JavaScript性能优化实战烈嘿
  • 2.【.NET10 实战--孢子记账--产品智能化】--升级前的准备工作:项目依赖梳理与升级计划制定
  • 【亲测免费】 探秘未来终端:X-CMD - 你的云上弹指神通!
  • JVM太难了!快来学习!
  • 华为AR 1200-s 路由器开启WEB