【C语言入门10】指针(1)

发布时间:2026/10/26 10:22:31

【C语言入门10】指针(1) 1.内存和地址1.1内存在讲内存和地址之前我们想一个生活中的案例假设有一栋宿舍楼把你放在楼里楼上有100个房间但是房间没有编号你的一个朋友来找你玩如果想找到你就得挨个房子去找这样效率很低但是我们如果根据楼层和楼层的房间的情况给每个房间编上号我们就可以快速的找到房间。生活中每个房间有了房间号就能提高效率能快速的找到房间。对于计算机也是如此我们知道计算机上CPU在处理数据的时候需要的数据是在内存中读取的处理后的数据也会放回内存中那我们买电脑的时候电脑上内存是8GB/16GB/32GB等那这些内存空间如何高效的管理呢其实也是把内存划分为一个个的内存单元每个内存单元的大小去1个字节。计算机中常见的单位补充一个比特位可以存储一个2进制的1或01Byte 8bit1KB 1024Byte1MB 1024Byte1GB 1024KB1TB 1024GB1PB 1024TB其中每个内存单元相当于一个学生宿舍一个字节空间里面能放8个比特位就好比同学住的八人间每个人是一个比特位。每个内存单元也都有一个编号这个编号就相当于宿舍房间的门牌号有了这个内存单元的编号CPU就可以快速找到一个内存空间。然后这些编号是不需要存的1.2。生活中我们把门牌号也叫地址在计算机中我们把内存单元的编号也称地址。C语言中给地址起了新的名字叫指针。内存单元的编号 地址 指针1.2究竟该如何理解编址首先必须理解计算机内是有很多的硬件单元而硬件单元是要互相协同工作的。所谓的协同至少相互之间要能够进行数据传递。但是硬件与硬件之间是互相独立的那么如何通信呢用“线”连起来。而CPU和内存之间也是有大量的数据交互的所以两者必须也用先连起来。CPU访问内存中的某个字节空间必须知道这个字节空间在内存的什么位置而因为内存中字节很多所以需要给内存进行编址就如同宿舍很多需要给宿舍编号一样。计算机中的编址并不是把每个字节的地址记录下来而是通过硬件设计完成的。像乐器上面没有写上“剁、来、咪、发、唆、拉、西”这样的信息但演奏者照样能够准确找到每一个琴弦的每一个位置这是为何因为制造商已经在乐其硬件层面上设计好了并且所有的演奏者都知道。本质是一种约定出来的共识。硬件编址也是如此我们可以简单理解32位机器有32根地址总线每根线只有两态表示0,1高低电平那么一根线就能表示2种含义2根线就能表示4种含义依次类推。32根地址线就能表示2^32种含义每一种含义都代表一个地址。地址信息被下达给内存在内存上就可以找到该地址对应的数据将数据在通过数据总线传入CPU内寄存器。给内存里每一个独立的存储单元我们 PC 默认是 1 个字节分配一个唯一编号这个编号就叫【地址】CPU 靠这个编号找到对应的字节。CPU把地址二进制信号发到地址总线地址总线送到内存芯片的地址译码器译码硬件电路自动算出这个二进制地址对应哪一个存储单元把它选中CPU通过控制总线发信号是读内存还是写内存数据走数据总线双向传输2.指针变量和地址2.1取地址操作符在C语言中创建变量其实就是向内存申请空间比如比如上述的代码就是创建了整型变量a内存中申请4个字节用于存放整数10其中每个字节都有地址。我们如果要取a的地址就可以是使用- 取地址操作符。a取出的是a所占4个字节中地址较小的字节的地址。虽然整型变量占用4个字节我们只要知道了第一个字节地址顺藤摸瓜访问到4个字节的数据也是可行的。2.2指针变量和解引用操作符*那我们通过取地址操作符拿到的地址是一个数值如000000AB01EFF884这个数值有时候也是需要存储起来方便后期再使用的那我们把这样的地址值存放在哪里呢放在指针变量中。指针变量也是一种变量这种变量就是用来存放地址的存放在指针变量中的值都会理解为地址。2.2.2如何拆解指针类型我们看到pa的类型int**是在说明pa事指针变量而前面的int是在说明pa指向的是整型int类型的对象。int a 10; int* pa a;这里pa左边写的是int**是在说明pa是指针变量而前面的int时在说明pa指向的是整型int类型的对象。那如果有一个char类型的变量chch的地址要放在什么类型的指针变量中呢char ch w; char* pc ch;2.2.3解引用操作符我们将地址保存起来未来是要使用的那怎么使用呢在现实生活中我们使用地址要找到一个房间在房间里可以拿去或者存放物品。C语言中其实也是一样的我们只要拿到地址指针就可以通过地址指针找到指针指向的对象这里必须学习一个操作符叫解引用操作符*。上面代码中printf(%d\n, *pa)就使用了解引用操作符*pa的意思就是通过pa中存放的地址找到指向的空间*pa其实就是a变量了所以打印结果是10。然后我们还能通过*pa0把a改成0把a的修改交给了pa来操作这样对a的修改就多了一种途径写代码就会更加灵活。2.3指针变量的大小前面的内容我们了解到32位机器假设有32根地址总线每根地址线出来的电信号转换成数字信号后是1或者0那我们把32根地址线产生的2进制序列当做一个地址那么一个地址就是32个bit位需要4个字节才能存储。如果指针变量是用来存放地址的那么指针变量的大小就得是4个字节的空间才可以。同理64位机器假设有64根地址线一个地址就是64个二进制位组成的二进制序列存储起来就需要8个字节的空间指针变量的大小就是8个字节。#includestdio.h int main() { //指针变量的大小取决于地址的大小 //32位平台下地址是32个bit位即4个字节 printf(%zd\n, sizeof(char*)); printf(%zd\n, sizeof(int*)); printf(%zd\n, sizeof(short*)); printf(%zd\n, sizeof(double*)); return 0; }结论32位平台下地址是32个bit位指针变量大小是4个字节64位平台下地址是64个bit位指针变量大小是8个字节注意指针变量的大小和类型是无关的只要指针类型的变量在相同的平台下大小都是相同的。3.指针变量类型的意义指针变量的大小和类型无关只要是指针变量在同一个平台下大小都是一样的为什么还要有各种各样的指针类型呢3.1指针的解引用对比下面2段代码主要在调试时观察内存的变化。int main() { int n 0x11223344; int* pi n; *pi 0; return 0; } int main() { int n 0x11223344; char*pi (char*) n; //强制转换只改指针的解读规则不改内存里已经存在的那 4 个字节 *pi 0; return 0; }调试我们可以看到代码1会将n的4个字节全部改为0但是代码2只是将n的第一个字节改为0。结论指针的类型决定了对指针解引用的时候有多大的权限一次能操作几个字节。比如char*的指针解引用就只能访问一个字节而int*的指针的解引用就能访问四个字节3.2指针-整数我们可以看出char*类型的指针变量1跳过1个字节int*类型的指针变量1跳过了4个字节。这就是指针变量的类型差异带来的变化。指针1其实跳过1个指针指向的元素。指针可以1那也可以-1.结论指针的类型决定了指针向前或者向后走一步有多大距离。3.3void*指针在指针类型中有一种特殊的类型是void*类型的可以理解为无具体类型的指针或者叫泛型指针这种类型的指针可以用来接收任意类型地址。但是也有局限性void*类型的指针不能直接进行指针的-整数和解引用的运算。使用void*类型的指针接收地址int main() { int a 10; void* pv1 a; void* pv2 a; *pv1 10; *pv2 0; return 0; }这里我们可以看到void*类型的指针可以接收不同类型的地址但是无法直接进行指针运算。那么void*类型的指针到底有什么用呢一般void*类型的指针是使用在函数参数的部分用来接收不同类型数据的地址这样的设计可以实现泛型编程的效果。使得一个函数来处理多种类型的数据。4.指针运算指针 整数 指针指针 - 整数 指针指针 - 指针 整数 得到的是指针和指针之间的元素各数前提两个指针指向同一块空间4.1指针-整数因为数组在内存中是连续存放的只要知道第一个元素的地址顺藤摸瓜就能找到后面的所有元素。int main() { int arr[10] { 1,2,3,4,5,6,7,8,9,10 }; int* p arr[0]; int i 0; for (i 0; i 10; i) { printf(%d , *(p i)); } return 0; } int main() { int arr[10] { 1,2,3,4,5,6,7,8,9,10 }; int* p arr[0]; int i 0; for (i 0; i 10; i) { printf(%d , *p ); p; } p arr[0];//回到起始位置 return 0; }4.2指针-指针#includestring.h size_t my_strlen(char* p) { char* start p; //指针变量存的是起始地址 while (*p ! \0)//*p解引用p这个地址里面存的字符 p; return p - start; } int main() { char arr[] abcdef; //[a b c d e f \0] size_t len my_strlen(arr);//统计的是\0之前的字符个数 printf(%zu\n, len); return 0; } //数组名是地址是数组首元素的地址arr[0] arr //数组名在传参的时候,把数组首元素arr[0]的地址赋值给指针变量 p。4.3 指针的关系运算 !int main() { int arr[] { 1,2,3,4,5,6,7,8,9,10 }; int* p arr; int sz sizeof(arr) / sizeof(arr[0]); while (p arr[sz]) { printf(%d , *p); } return 0; }本文主要围绕 C 语言中的内存与指针展开首先介绍了内存单元、地址以及内存编址的基本概念接着学习了取地址操作符、解引用操作符*和指针变量的大小。随后进一步分析了不同指针类型的作用理解了指针类型对解引用权限和指针步长的影响并介绍了void* 指针的特点。最后通过数组遍历、模拟strlen函数以及指针关系运算等示例学习了指针的基本运算方式。指针是 C 语言学习中的重要内容也是理解数组、函数参数和动态内存管理的基础。 初学阶段不仅要记住指针的使用方法更要理解地址、类型与内存之间的关系多动手调试代码才能逐步掌握指针的使用技巧。本文作为个人 C 语言学习笔记如有理解不准确或存在错误的地方欢迎大家批评指正
延伸阅读

更多相关文章

2026/10/26 10:22:31

AI智能报警系统核心技术解析与实践

1. 项目概述:AI智能报警系统的技术革新这个系统本质上是在重构传统安防行业的运作逻辑。过去十年我参与过多个报警系统项目,最深的体会就是:90%的传统报警系统都在做"事后诸葛亮"。它们要么误报频发让安保人员疲于奔命,…

2026/10/26 10:17:30

小白程序员必备:Agent开发进阶指南,轻松掌握大模型核心技术!

本文介绍了Agent开发作为当前大模型领域核心的重要性,强调了掌握Agent开发技能对于AI岗位的竞争力。文章分为四个阶段,详细阐述了从基础入门到实战落地的学习路线,包括核心概念理解、原理与范式掌握、优化输出效果以及实际业务对接。通过系统…

2026/10/26 10:17:30

AI产品小白必看:找准定位,高效学习大模型知识体系

文章指出AI产品经理并非单一岗位,而是应用层、模型层和基建层三个岗位的统称。作者建议新手应根据自身优势、职业目标和公司阶段,选择主攻方向:应用层侧重场景与交互,模型层专注评估与选型,基建层关注成本与合规。明确…

2026/10/26 12:58:24

AI芯片选型避坑指南:读懂TOPS、能效比与带宽的真实含义

1. 这不是参数表,是AI芯片的“体检报告单” 你手头那张标着“算力XX TOPS”“能效比YY W/TOPS”的芯片参数页,真能当采购依据用?我见过太多团队拿着这张纸就拍板下单,结果模型一跑起来,显存爆了、温度飙到95℃、推理延…

2026/10/26 12:58:24

C语言AES-256-CBC实现:与Java JCE严格对齐的嵌入式加密方案

简介:本资源是一份面向信息安全开发者与嵌入式工程师的C语言AES-256-CBC加解密实现库,解决跨平台加密结果一致性难题,尤其适用于需与Java服务端协同加解密的物联网、金融终端或本地数据保护场景。压缩包共3个文件(2个C源码1个头文…

2026/10/26 12:58:24

AI芯片选型实战:避开TOPS陷阱的5个硬指标

1. 项目概述:当AI芯片清单从57种膨胀到120多种,我们到底在选什么? “一份AI芯片调查从57种写到120多种”——这句话不是夸张,而是我去年参与某高校边缘智能平台选型时的真实记录。起初团队只打算对比主流GPU和几款国产加速卡&…

2026/10/26 12:58:24

卷积核权重在具身智能中的动态学习与应用

1. 卷积核权重的本质:从手工设计到数据驱动 在具身智能系统的视觉感知模块中,卷积神经网络(CNN)承担着环境理解的核心任务。传统图像处理中的Sobel、Gauss等卷积核采用手工设计的固定权重,例如: # 手工设…

2026/10/26 12:58:24

AI芯片选型不是比参数,而是签五层计算契约

1. 这份AI芯片调查为什么从57种涨到120多种?——不是数据膨胀,是行业在裂变 “一份AI芯片调查从57种写到120多种”,这个标题乍看像数据新闻的常规迭代,但如果你真去翻过早期那份57款的清单,会发现它基本只覆盖了三类东…

2026/10/26 12:53:23

昇腾CANN Runtime架构与AIGC模型优化实践

1. CANN Runtime技术架构解析CANN(Compute Architecture for Neural Networks)作为专为神经网络计算设计的架构体系,其Runtime仓库承载着模型在昇腾NPU上高效执行的核心功能。这个"动力引擎"主要由以下几个关键组件构成&#xff1a…

2026/10/26 0:20:20

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/26 1:53:47

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/26 0:20:17

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/26 0:00:48

Nested Learning:解决AI灾难性遗忘的分层记忆架构

1. 为什么AI需要"记忆"能力?在传统深度学习模型中,我们常遇到一个根本性问题:模型在处理新任务时,往往会完全遗忘之前学到的知识。这种现象被业界称为"灾难性遗忘"(Catastrophic Forgetting)。想象一下&#…

2026/10/26 0:00:48

企业级大模型应用:OCR预处理、Dify编排与DeepSeek落地实战

1. 这不是“用大模型”,而是重构工作流的起点“大模型的应用和工具”——这八个字现在被贴在无数技术分享、招聘JD、内部立项书的标题栏里,但绝大多数人点进去后看到的,是零散的API调用示例、几个开源UI截图、或者一句“接入LLM就能降本增效”…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑