深⼊理解指针(1)

深入理解指针(1)


文章目录

  • 深入理解指针(1)
  • 一. 内存和地址
    • (一)内存
    • (二)如何理解编址
  • 二. 指针变量和地址
    • (一)取地址操作符`&`
    • (二)指针变量和解引用操作符`*`
      • 1. 指针变量
      • 2. 如何拆解指针类型
      • 3. 解引用操作符
    • (三)指针变量的大小
  • 三.指针变量类型的意义
    • (一)指针的解引用
    • (二)指针`+-`整数
    • (三)`void*` 指针
  • 四.指针运算
    • (一)指针`+-` 整数
    • (二)指针 `-` 指针
    • (三)指针的关系运算

一. 内存和地址

(一)内存

生活中,每个房间有了房间号,就能提高效率,快速的找到房间。对照到计算机中,计算机上CPU(中央处理器)在处理数据时,需要的数据是在内存中读取的,处理后的数据也会放回内存中。
要高效地管理这些内存空间,也是把内存划分为一个个的内存单元,每个内存单元的大小取1个字节,一个字节空间里面能放8个比特位。每个内存单元也都有一个编号(相当于宿舍房间的门牌号),有了这个内存单元的编号,CPU就可以快速找到一个内存空间。在计算机把内存单元的编号称为地址。C语言中给地址起了新的名字叫:指针。
所以可以理解为:内存单元的编号 == 地址 == 指针

计算机中常见的单位:一比特位可以存储一位2进制:1或者0

  • 1Byte = 8bit
  • 1KB = 1024Byte
  • 1MB = 1024KB
  • 1GB = 1024MB
  • 1TB = 1024GB
  • 1PB = 1024TB

(二)如何理解编址

计算机中的编址,并不是把每个字节的地址记录下来,而是通过硬件设计完成的。
计算机内有很多的硬件单元,但是硬件与硬件之间是互相独立的。要用"线"连起来,使硬件单元相互之间能进行数据传递来通信从而协同工作。而CPU和内存之间也有大量的数据交互的,所以,两者必须也用线连起来。不过,此处只介绍一组线——地址总线。
32位机器有32根地址总线,每根线只有两态,表示0,1【电脉冲有无】,那么1根线,就能表示2种含义,32根地址线,就能表示232种含义,每一种含义都代表一个地址。地址信息被下达给内存,在内存上,就可以找到该地址对应的数据,再将数据通过数据总线传入CPU内寄存器。

二. 指针变量和地址

(一)取地址操作符&

在C语言中创建变量其实就是向内存申请空间,例如:

上述的代码就是创建了整型变量a,内存中申请4个字节,用于存放整数10,其中每个字节都有地址,上图中4个字节的地址分别是:

  • 0x65BD0FF934
  • 0x65BD0FF935
  • 0x65BD0FF936
  • 0x65BD0FF937

变量在内存中的存储


&a取出的是a所占4个字节中地址较小的字节的地址。
整型变量占用4个字节,只要知道了第一个字节地址,就可以顺藤摸瓜访问到4个字节的数据。

(二)指针变量和解引用操作符*

1. 指针变量

通过取地址操作符(&)拿到的地址是一个数值,例如:0x65BD0FF934,这个数值有时候也需要存储起来,方便后期再使用,把这样的地址值存放在指针变量中。
指针变量也是一种变量,这种变量是用来存放地址的,存放在指针变量中的值都会理解为地址。
例如:

inta=10;int*pa=&a;//取出a的地址并存储到指针变量pa中

2. 如何拆解指针类型

上例里的指针pa的类型是int*。

  • *是在说明pa是指针变量
  • *前⾯的int表示pa指向的对象是整型类型。

    例如:ch,。
charch='w';//ch是char类型的变量char*pc=&ch;//所以ch的地址是char*类型

3. 解引用操作符

将地址保存起来,怎么使用?
C语言中只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针)指向的对象,需要用到的操作符叫解引用操作符(*)。

inta=100;int*pa=&a;*pa=0;printf("%d\n",a);//0

上面代码中,*pa的意思就是通过pa中存放的地址,找到指向的空间,其实就是a变量;*pa = 0,这个操作符就是把a变量的值改成了0。

(三)指针变量的大小

32位机器,有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,把32根地址线产生的2进制序列当做一个地址,那么一个地址就是32个bit位,需要4个字节才能存储,指针变量的大小就得是4个字节的空间才可以。
同理64位机器,有64根地址线,一个地址就是64个二进制位组成的二进制序列,存储起来就需要8个字节的空间,指针变量的大小就是8个字节。

#include<stdio.h>//指针变量的⼤⼩取决于地址的⼤⼩//32位平台下地址是32个bit位(即4个字节)//64位平台下地址是64个bit位(即8个字节)intmain(){printf("%zd\n",sizeof(char*));printf("%zd\n",sizeof(short*));printf("%zd\n",sizeof(int*));printf("%zd\n",sizeof(double*));return0;}

结论:
• 32位平台下地址是32个bit位,指针变量大小是4个字节
• 64位平台下地址是64个bit位,指针变量大小是8个字节
• 注意:指针变量的大小和类型无关,只取决于地址线,在相同的平台下,大小都是相同的。

三.指针变量类型的意义

(一)指针的解引用

代码1:

代码2:

调试可以看到,代码1会将n的4个字节全部改为0,但是代码2只是将n的第一个字节改为0。
结论:指针的类型决定了,对指针解引用的时候有多大的权限(一次能操作几个字节)。
例如:char*的指针解引用只能访问一个字节,而int*的指针的解引用能访问四个字节。

(二)指针+-整数

char*类型的指针变量+1,跳过1个字节,int*类型的指针变量+1,跳过了4个字节。
这就是指针变量的类型差异带来的变化。指针+1,其实是跳过1个指针指向的元素。
结论:指针的类型决定了指针向前或者向后走一步有多大(距离)。

(三)void*指针

在指针类型中有一种特殊的类型是void *类型,可以理解为无具体类型的指针,这种类型的指针可以用来接受任意类型地址。但是,void*类型的指针不能直接进行指针的+-整数和解引用的运算。
用途:void*类型的指针在函数参数的部分使用,用来接收不同类型数据的地址,这样的设计使得一个函数可以处理多种类型的数据。

四.指针运算

指针的基本运算有三种,分别是:

  • 指针+-整数
  • 指针-指针
  • 指针的关系运算

(一)指针+-整数

数组在内存中是连续存放的,只要知道第一个元素的地址,就能找到后面的所有元素。
方法1:

intarr[10]={1,2,3,4,5,6,7,8,9,10};int*pa=&arr[0];//首元素地址inti=0;for(i=0;i<10;i++){printf("%d ",*(pa+i));//指针不动,i变来改变地址,从而打印数组里的值}

方法2:

for(i=0;i<10;i++){printf("%d ",*pa);//指针动,从而打印数组里的值pa++;//缺点:指针改变了,如果后面还要用,要让p回到原来位置,再初始化一下}

(二)指针-指针

指针-指针:得两指针之间的元素个数。(前提:两指针指向同一块空间)
例:strlen函数:计算字符串\0之前的字符个数,用指针-指针实现strlen函数。

#include<stdio.h>size_tmy_strlen(char*p){char*start=p;while(*p!='\0')//!='\0'可以去掉,因为\0的ASCll码是0{p++;}returnp-start;//\0的地址-首地址即字符的个数}intmain(){chararr[]={"abcdef"};size_ta=my_strlen(arr);//自定义函数,数组名等价数组首元素的地址printf("%zu\n",a);//6return0;}

(三)指针的关系运算

intarr[]={1,2,3,4,5,6,7,8,9,10};int*p=&arr[0];intsz=sizeof(arr)/sizeof(arr[0]);//元素个数while(p<&arr[sz])//只是用一下地址,没有非法访问,用地址来循环.{printf("%d ",*p);p++;}

相关新闻

自然语言到优化求解:构建可解释的约束驱动系统

自然语言到优化求解:构建可解释的约束驱动系统

1. 这不是又一个“调用大模型API”的玩具项目“从零构建一个自己的自然语言优化求解系统”——这个标题里最需要被拆开揉碎、重新校准的&#xff0c;是“自己的”和“优化求解”这两个词。它不指向一个封装了ChatGLM或Qwen接口的网页前端&#xff0c;也不等于在LangChain里拖拽…

2026/10/20 19:53:51 阅读更多 →
支付宝分账和微信分账哪个好用?商户怎么挑?

支付宝分账和微信分账哪个好用?商户怎么挑?

服装批发市场里&#xff0c;有个档口老板同时挂着微信和支付宝两个收款码&#xff0c;来找货的小店主习惯微信付款&#xff0c;线上拿货的分销商偏爱支付宝。后台一看&#xff0c;两个平台都能分账&#xff0c;功能列表长得差不多&#xff0c;他犯起难来&#xff1a;到底该以哪…

2026/10/20 19:53:51 阅读更多 →
微服务通信从Socket到HTTP/RPC:Spring Cloud连接与超时排查实践

微服务通信从Socket到HTTP/RPC:Spring Cloud连接与超时排查实践

现在做微服务的人&#xff0c;十有八九会被“通信”这件事绕晕。Spring Cloud微服务通信、Socket、HTTP、RPC这几个词放在一起&#xff0c;乍看好像谁跟谁都不太熟&#xff0c;但实际工作中它们全在回答同一个问题&#xff1a;两个服务之间要传数据&#xff0c;到底怎么传、走哪…

2026/10/20 19:53:51 阅读更多 →

最新新闻

基于chronos2时序大模型的新能源功率预测实战

基于chronos2时序大模型的新能源功率预测实战

做新能源功率预测这行有几年了&#xff0c;光伏、风电、负荷这三类曲线基本每天都在打交道。以前要么用物理模型打底&#xff0c;要么上LSTM、XGBoost这类传统时序模型&#xff0c;调参调到怀疑人生。最近我把chronos2这套预训练时序模型拉出来&#xff0c;专门对着光伏功率、风…

2026/10/20 21:59:59 阅读更多 →
PHP+MySQL轻量状态机:可调试的规则驱动服务框架

PHP+MySQL轻量状态机:可调试的规则驱动服务框架

简介&#xff1a;这是一份面向PHP中级开发者与AI初学者的开源实践项目&#xff0c;旨在通过轻量级技术栈实现人工智能系统的核心逻辑。项目以OOP PHP为运算中枢&#xff0c;MySQL为持久化记忆单元&#xff0c;构建出具备学习与决策能力的简易AI原型&#xff0c;适用于Web智能模…

2026/10/20 21:59:59 阅读更多 →
Fiddler抓包工具详解:从代理原理到HTTPS解密与接口调试实战

Fiddler抓包工具详解:从代理原理到HTTPS解密与接口调试实战

Fiddler&#xff08;标题里写成 Fidder 也不影响&#xff0c;指的就是它&#xff09;是我平时做接口联调、定位线上 bug 时用得最多的工具。一个不起眼的小窗口&#xff0c;却能把我电脑和手机发出去的每一个 HTTP/HTTPS 请求记录下来&#xff0c;请求头、请求体、返回内容全都…

2026/10/20 21:59:59 阅读更多 →
从零搭建大模型:Happy-LLM六阶段实战路线全解析

从零搭建大模型:Happy-LLM六阶段实战路线全解析

1. 先别急着搭模型&#xff1a;为什么你需要一条完整路线1.1 从到处刷教程到踏实走完闭环一直有朋友问我"大模型到底怎么学"。说实话&#xff0c;这个问题我当年也问过不少人&#xff0c;得到的答案五花八门&#xff1a;有让我先啃半年代数加概率论的&#xff0c;有说…

2026/10/20 21:59:59 阅读更多 →
STM32L5/H5与CubeMX v6.12实战指南:安全外设配置边界与绕坑方案

STM32L5/H5与CubeMX v6.12实战指南:安全外设配置边界与绕坑方案

我注意到输入内容中存在严重信息缺失&#xff1a;项目标题提到“STM32C5”与“CubeMX2”&#xff0c;但这两个名称在当前嵌入式开发领域并不存在——ST官方从未发布过型号为 STM32C5 的MCU系列&#xff08;现有主流系列为F0/F1/F3/F4/F7/H7/L0/L1/L4/L5/U0/U5/WB/WS等&#x…

2026/10/20 21:59:59 阅读更多 →
本体驱动的AI原生应用开发:让知识结构成为AI操作系统

本体驱动的AI原生应用开发:让知识结构成为AI操作系统

1. 项目概述&#xff1a;当“知识结构”成为AI应用的底层操作系统你有没有遇到过这样的情况&#xff1a;写一个智能客服系统&#xff0c;规则改三次&#xff0c;模型微调五轮&#xff0c;最后发现90%的问题其实出在“我们对‘退货’‘换货’‘补发’这几个概念到底怎么界定”上…

2026/10/20 21:58:56 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →