内存指针是什么?为什么指针还要有偏移量? 📅 发布时间:2026/7/11 19:42:28 👁️ 浏览次数: 原文链接 内存指针是什么为什么指针还要有偏移量 Ping通途说1. 什么是内存指针、偏移量内存指针是一个存储内存地址的变量它指向计算机内存中的某个特定位置。可以把它想象成现实世界的比喻指针就像房子的门牌号告诉你某个数据“住在”内存的哪个位置本质指针本身也是一个变量但它的值不是普通数据而是内存地址int num 42; // 普通变量存储数字42 int *ptr num // 指针变量存储num的内存地址而偏移量是让指针真正强大的关键特性主要可以用于数组访问、结构体和类成员访问、数据遍历甚至动态操作内存。以数组访问为例可以很明显看出其功能这不就是主流编程语言都有的索引。int arr[5] {10, 20, 30, 40, 50}; int *ptr arr; // 指向数组首元素 // 通过偏移访问 int third *(ptr 2); // 访问第三个元素30以及令人望而生畏的手动内存管理实际上在指针上增加偏移值以指向对应内存进行处理int *buffer malloc(100 * sizeof(int)); // 填充第50个位置 *(buffer 49) 123;但偏移量不跟数组的索引一样而是根据数据类型自动缩放其范围。MySQL中常见的int和tinyint大家应该都知道一个占4字节另一个就是占1字节。由于C没有tinyint所以用char代替int *ptr 0x1000; // 假设内存地址 ptr 1; // 实际上指向 0x1004int通常是4字节 ptr 3; // 实际上指向 0x100C跳过4x312字节 char *cptr 0x1000; cptr 1; // 指向 0x1001char是1字节因此需要注意偏移的不是第几个值而是第几个同类型元素2. 再说简单些以及怎么取一整段数据你应该知道数据最终呈现的格式就是1和0因此在内存中也都是0/1的位。指针本身就是一段数据的起点偏移值就是取起点的第n个同类型元素。指针偏移就像在内存中跳格子每个格子的大小由指针类型决定你可以精确控制要访问哪个或哪几个连续格子中的数据。另外需要注意偏移量的范围不得超出内存范围否则轻则软件崩溃重则系统崩溃蓝屏。由于偏移值只能指向一个位置C也没有Python那样直接通过data[0,5]取范围值因此主要通过for遍历来操作一段数据1. 数组表示法最简单int arr[10] {0,1,2,3,4,5,6,7,8,9}; int *start arr[2]; // 从第3个元素开始 int *end arr[7]; // 到第8个元素结束 // 取第3到第8个元素 for(int *p start; p end; p) { printf(%d , *p); // 输出: 2 3 4 5 6 7 }2. 结构体/对象的连续块struct Point { //定义一个点的结构体 int x; int y; }; struct Point points[5] {{1,2}, {3,4}, {5,6}, {7,8}, {9,10}}; struct Point *ptr points; // 取连续3个Point for(int i 0; i 3; i) { printf(Point %d: (%d, %d)\n, i, (ptr i)-x, // 或 ptr[i].x (ptr i)-y); }3. 动态内存操作// 分配连续内存块 int *buffer malloc(50 * sizeof(int)); // 方法1: 指针移动 int *current buffer; for(int i 0; i 50; i) { *current i * 2; // 赋值 current; // 指针向后移动一个int } // 方法2: 数组下标 for(int i 0; i 50; i) { buffer[i] i * 2; }再用一个内存布局示例来展示一下假设内存中有这样的int数组地址值C写法0x100010arr[0]0x100420arr[1]0x100830arr[2]0x100C40arr[3]0x101050arr[4]int *ptr 0x1008; // 指向30 // 取连续3个值 int val1 *(ptr 0); // 30 int val2 *(ptr 1); // 40 int val3 *(ptr 2); // 50实际应用图像处理示例// 假设处理1280x720的图像每个像素4字节RGBA int width 1280; int height 720; uint8_t *image malloc(width * height * 4); // 取第100行开始的连续10行 int start_row 100; int row_count 10; uint8_t *region_start image (start_row * width * 4); uint8_t *region_end region_start (row_count * width * 4); // 处理这个区域 for(uint8_t *p region_start; p region_end; p 4) { // 每个像素4字节: p[0]R, p[1]G, p[2]B, p[3]A p[0] 255; // 设置红色 }3. 越界访问的界是什么界有两种一种是系统分配给软件的内存范围另一种就是数据结构范围。1.操作系统层面进程内存边界每个程序运行时操作系统为其分配一个虚拟地址空间例如0x00000000到0xFFFFFFFF// 试图访问非法地址 int *ptr (int*)0xFFFFFFFF; // 可能超出进程空间 *ptr 42; // 触发段错误(Segmentation Fault) // 后果程序立即崩溃操作系统保护 // 保护机制MMU内存管理单元 页表2.程序层面数据结构边界int arr[10]; arr[15] 42; // 越过了数组边界但仍在进程空间内导致的后果软件可能不会立即崩溃但会破坏其他变量数据堆栈破坏导致程序逻辑错误以及安全漏洞缓冲区溢出攻击
企业知识管理系统怎么选?17款工具对比:从协作编辑到安全合规 本文将深入对比17款企业知识管理软件:PingCode 知识管理、Confluence、Notion、Microsoft SharePoint、GitBook、Guru、Slab、Document360、360 亿方云、石墨文档等一、知识管理做不好,团队会被“重复劳动”拖慢企业一开始做知识管理,通常只是… 2026/7/12 2:40:14
viepress:vue组件展示和源码功能 VitePress实战:vue组件展示和源码功能 一、项目结构与基础配置 1.1 侧边栏配置(sidebar.ts) // docs/.vitepress/sidebar.ts export default {/example/: [{text: Examples,items: [{ text: Markdown Examples, link: /example/markdown }… 2026/7/9 16:16:17
Lua与C语言接口编程实战指南:打造高性能、灵活的程序 skynet中调用层次:skynet是多线程的,actor的调度和执行由线程池分配。 二、Lua环境搭建 (1)下载lua包并解压: 代码语言:Bash 自动换行 AI代码解释 wget -c http://www.lua.org/ftp/lua-5.3.0.tar.gz tar… 2026/7/9 8:11:30
PVZ Toolkit:如何高效增强你的植物大战僵尸游戏体验? PVZ Toolkit:如何高效增强你的植物大战僵尸游戏体验? 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit PVZ Toolkit是一款专门为《植物大战僵尸》PC版设计的开源游戏增强工具&… 2026/7/12 12:13:01
面向无人机与水面设备的微塑料YOLO检测数据集(含多光照、多视角真实海洋样本) 本文还有配套的精品资源,点击获取 简介:1154张真实海洋场景图像,覆盖无人机高空航拍和水面近景拍摄两种视角,包含不同浑浊度水体、晴天/阴天/反光等多种光照条件。所有图片已按YOLOv5/v7/v8通用格式标注,直接支持训… 2026/7/12 12:11:01
STC89C52电子密码锁工程:支持掉电存密、LCD实时显示、矩阵键盘输入与完整调试资源 本文还有配套的精品资源,点击获取 简介:基于STC89C52单片机的电子密码锁完整可运行工程,支持4位数字密码输入、三次错误锁定、密码修改功能;密码数据掉电后自动保存至AT24C02 EEPROM芯片,通过标准I2C协议读写&#… 2026/7/12 12:09:00
直流有刷电机驱动系统设计与实现:H桥与PIC18F控制 1. 项目背景与核心器件选型在工业自动化和小型机电设备领域,直流有刷电机因其结构简单、控制方便、成本低廉等优势,仍然是许多应用场景的首选驱动方案。本次项目采用的TC78H651AFNGTOSHIBA H桥驱动器与Microchip PIC18F2610微控制器组合,构成… 2026/7/12 12:09:00
TMC7300与STM32L432KC实现高效直流电机控制方案 1. TMC7300与STM32L432KC电机控制方案概述有刷直流电机在工业自动化、消费电子和机器人领域广泛应用,但其控制稳定性一直是工程师面临的挑战。本文将详细介绍基于TMC7300电机驱动器和STM32L432KC微控制器的解决方案,该组合能够实现高效、精准的电机控制。… 2026/7/12 12:07:00
GPT-5.6 全面解读:三档模型、推理能力、价格与迁移实战 摘要 2026 年 7 月 9 日,OpenAI 正式推出 GPT-5.6 系列,并在 ChatGPT、Codex 与 API 中逐步开放。这次升级的重点并非单纯扩大参数或上下文窗口,而是通过 Sol、Terra、Luna 三档模型覆盖不同成本区间,再结合 max 推理强度、Pro 模… 2026/7/12 12:07:00
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14