C语言复习第6章 指针(未完成)
目录
- 一、内存单元与指针
- 1.1 内存单元与内存单元的编号(地址/指针)
- 1.2 内存单元的编号是如何产生的?
- 1.3 地址/内存单元的编号/指针 本身是不需要保存的
- 1.4 32/64位机器最多可以管理多大的内存空间?
- 1.5 怎么计算指针(地址/编号)的大小
- 二、指针到指针变量
- 2.1 怎么把二进制转换成十六进制
- 2.2 平时说的"指针"的两种理解方式
- 2.3 指针变量的概念
- 2.4 类比int理解指针变量
- 2.5 指针变量的大小
- 2.6 取地址&(在内存层面理解int a = 10)
- 2.7 int * pa = &num如何解析
- 2.8 *解引用
- 2.9 有关内存调试窗口指针变量的一些说明
- 2.10 说明
- 三、指针类型和指针运算
- 四、指针和数组
- 五、指针和字符
- 六、指针和函数
- 七、回调函数
- 总结
一、内存单元与指针
1.1 内存单元与内存单元的编号(地址/指针)
思考:既然要使用这些内存 那计算机是怎么管理/使用这些内存空间的?
- 把内存空间划分成一个一个的内存单元 并给他们编上号 实践中 每个内存单元的大小为1字节
- 内存单元的编号(地址) 在C语言中就叫指针
- 门牌号(地址)----->找到某个房间 编号(地址/指针)----->找到某个内存单元
- 内存单元的编号 = 地址 = 指针(变量)
1.2 内存单元的编号是如何产生的?
- 这是硬件层面的(电路) 问题 是因为地址线通电产生的二进制序列
- 以32位机器为例 可能产生一个00000000 00000000 00000000 00000001的序列 它就可以作为一个内存单元的编号(地址/指针) 一般用十六进制表示:0x00 00 00 01
- 32位二进制—>8位十六进制
1.3 地址/内存单元的编号/指针 本身是不需要保存的
下图右边这些地址(指针) 本身已经通过硬件层面产生了 本身是不需要存储在内存空间里的 所以并不存在"用4/8个字节代表or管理1个字节的内存单元是不是太浪费"之说(不存起来才好 存起来反而浪费)
除非你想把某个地址取出来 比如说ff40 那么就需要创建一个指针变量p 然后把ff40给p 这个时候p就需要申请一块内存用来存放ff40了 把地址取出来 赋给一个指针变量 这个时候 才算"地址需要内存空间来存放"
设想:内存单元那么多 一开就把每个内存单元的地址存起来 是不是太浪费了? 而且 就算真存起来了 一个指针变量是四个字节 我用4个字节 去管理1个字节大小的内存单元空间 也不合理
- 总而言之 每个内存单元它的地址一开始是硬件电路层面就设定好的 不需要额外安排内存来存储这些地址 除非真的&取出某个内存单元的地址然后赋给某个指针变量 才需要申请内存空间
1.4 32/64位机器最多可以管理多大的内存空间?
首先要理解:内存单元如何进行编址的?
32位机器上 有32根地址线
地址线通电 有高(1)低(0)电平 转换成数字信号就是0和1
32根地址线产生的二进制序列 一共有如下可能性:
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000010
…
01111111 11111111 11111111 11111111
10000000 00000000 00000000 00000000
10000000 00000000 00000000 00000001
…
11111111 11111111 11111111 11111111
把他们依次作为内存单元的地址
一共就能表示232个这样的地址 从而管理这么多个内存单元
一般地址用16进制表示 也就是形如:0x0012ff40(4个二进制位–>1个十六进制位 32位机器的地址就是有32个二进制位表示 也就是8个十六进制位)
一个地址 管理一个内存单元
一个内存单元 大小是一个字节
也就是一共可以管理232个字节的内存空间 也就是4GB(232÷210÷210÷210)
- 同理 64位机器最多就是管理 234GB(4*232) 的内存空间
1.5 怎么计算指针(地址/编号)的大小
指针(地址/编号)本身的大小:
- 指针本身的大小是由机器位数决定的
- 32位机器 地址(指针)用32个0或者1表示 也就是32个比特位 也就是4字节
- 64位机器 地址(指针)用64个0或者1表示 也就是64个比特位 也就是8字节
二、指针到指针变量
2.1 怎么把二进制转换成十六进制
- 16进制最大就是15 最小是0
- 用4个二进制位(0000~1111) 就足够表达1个十六进制位所有可能取值了
- 所以把二进制–>十六进制的时候 4个二进制一组 进行转换
2.2 平时说的"指针"的两种理解方式
- 本质上 指针其实是地址 = 内存单元的编号 即内存单元的编号=地址=指针
- 但平时说的指针 通常说的是指针变量(存放指针的变量)
2.3 指针变量的概念
- 指针变量就是用来存放指针(地址/编号)的变量
- 而指针/地址/编号唯一标识一个内存单元
2.4 类比int理解指针变量
- 地址无非就是8个或者16个十六进制数组成的一个十六进制数 它和10,1一样 本质也是一个数字 只不过是数值的不同形式
- 而我们习惯用十六进制表示地址(指针/编号)
- %p可以打印出地址(指针)的16进制形式 当然也可以直接用%d看看它对应的十进制(但是没什么意义)
- 10要存到int里去 那么指针就要存到指针变量里去
- int * pa = &a;//pa就被称为指针变量
- 指针变量也是一种变量 专门用来存放地址(指针/内存单元编号)
图解:
- p放的只是num的首地址(第一个内存单元的编号)
2.5 指针变量的大小
存放指针的变量(指针变量)的大小:
- 注意:sizeof返回的是无符号整形 所以用%zd占位符比较好 用zd就不报警告了
- 前面说 指针(编号/地址)的大小是4/8字节 所以放指针的变量 也就是指针变量 他的大小也应该是4/8字节 即指针变量的大小 也和它所指向的数据的类型无关 只和机器位数有关
- 32位机器:地址(指针/编号)用32个比特位表示=4字节 故指针变量4字节
- 64位机器:地址(指针/编号)用64个比特位表示=8字节 故指针变量8字节
- 可以这么说 因为指针(地址/编号)的大小是4/8字节 所以指针变量才需要4/8字节这么大去存放他们
进一步理解 假设在32位机器上:
int a = 10; a申请到的内存里放的内容是:0a 00 00 00(小端)
int *p = &a;请问p申请到的内存里放的是什么? 或者说需要放什么?(假设32位机器 即32根地址线)
答:放的是a申请到的那四个内存单元第一个内存单元的地址 也就是32个bit位 那指针变量p的大小肯定就是32bit = 4byte = 4字节了!
也就是说如果拿一个变量(指针变量)来接收一个指针(地址/编号) 该指针变量至少需要32bit的空间才能放得下—>指针变量大小就是32bit=4字节 只和机器位数有关
2.6 取地址&(在内存层面理解int a = 10)
-
从下图打印结果不难看出 a的地址是由16位十六进制数字成的 即64位的二进制数字组成的 也就说我有64根地址线 那就是64位机器
-
%p–>专门用来打印地址(指针变量)的
问题来了:我取出a的地址 打印 只打印了一个地址 前面不是说一个地址只能表示一个内存单元的地址吗? 但是a明明占用了4字节也就是4个内存单元
-
推测:&a 只是把a占用的四个内存单元的 第一个较小的地址取出来了
-
经调试 猜测正确 &a取到的就是申请到的四个内存单元的首地址
-
第二张图打错字了 不是但看 是单看
-
图解:
2.7 int * pa = &num如何解析
- int num = 10:把变量名num去掉 剩下的部分就是num的数据类型
- pa是个指针变量 里面存放的是指针(地址/内存单元编号)
- 把变量名去掉 剩下的就是数据类型:去掉pa 剩下的int* 就是pa的数据类型(指针变量)
- 把*pa去掉 剩下的就是该指针变量所指向的对象的数据类型:去掉*pa 剩下的int就表示指针变量pa指向的是一个int类型的数据
*先和pa结合 说明pa是一个指针变量 再去掉*pa 说明pa指向的是一个int
2.8 *解引用
指针变量里存放的是一个指针 也就是一个地址
*指针变量 就是根据这个地址 找到地址对应的内容
2.9 有关内存调试窗口指针变量的一些说明
首先弄清楚几个点 在64位机器下:
- 指针变量 自己也需要内存空间 也有大小 取决于机器是多少位
- 每个内存单元大小1字节 故int a需要申请四个内存单元来放a的内容
- 且这四个内存单元 每个内存单元都对应1个8字节大小的地址
- 而 &a只是把第一个内存单元的地址取出来了 但a确实占了四个内存单元
- 不同位数的机器int a 都是申请4字节 也就是四个内存单元 但是每个内存单元的地址的大小不相同
下图要做一些修正:a本身就占了32bit
二进制应该是00000000 00000000 00000000 00010001 也就是0x00 00 00 11
小端存就是:11 00 00 00 第一个内存单元存的是0x11
- 取出指针变量的地址 也是类似的 p也是有自己的地址的
2.10 说明
为了方便起见 int * pa = &a
将来就说pa是一个指针
其实说是指针变量才是最精确的
三、指针类型和指针运算
四、指针和数组
五、指针和字符
六、指针和函数
七、回调函数
总结
相关文章:

C语言复习第6章 指针(未完成)
目录 一、内存单元与指针1.1 内存单元与内存单元的编号(地址/指针)1.2 内存单元的编号是如何产生的?1.3 地址/内存单元的编号/指针 本身是不需要保存的1.4 32/64位机器最多可以管理多大的内存空间?1.5 怎么计算指针(地址/编号)的大小 二、指针到指针变量2.1 怎么把二进制转换…...
Carrier Aggregation 笔记
### Carrier Aggregation 笔记 #### 引言 - Carrier Aggregation(CA)是 LTE 高级技术之一,srsRAN 4G 支持在 srsENB 和 srsUE 中进行双载波聚合。 - 使用 srsRAN 4G 进行 CA 实验需要能够调谐不同频率的 RF 设备,例如 Ettus Rese…...
JAVA的ArrayList 和 LinkedList的区别
ArrayList 和 LinkedList 都是 Java 中常用的 List 接口的实现类,主要的区别有: 1. 底层数据结构不同 -ArrayList 底层使用的是动态数组数据结构,LinkedList 底层使用的是双向链表数据结构。 2. 获取元素效率不同 ArrayList 支持快速随机访问,通过索引直接获取元素,时间复杂…...

AI知识库如何提升服装电商的运营效率
随着人工智能技术的飞速发展,AI知识库在服装电商领域的应用日益广泛。AI知识库作为一个集成了海量数据、通过高级算法进行智能分析和处理的信息系统,正在深刻改变服装电商的运营模式和效率。本文将详细阐述AI知识库在商品信息管理、库存管理、订单处理等…...
鸿蒙开发(NEXT/API 12)【使用fetch发送网络请求】远场通信服务
场景介绍 发送一个HTTP请求,也可以设置请求头和请求体等参数,并返回来自服务器的HTTP响应。使用Promise异步回调。常用于获取资源,支持流处理和通过拦截器来处理请求和响应。 接口说明 接口名描述fetch(request: Request): Promise发送一个…...

详细解读“霸王面”战术
“霸王面”战术是指在没有得到雇主面试通知的情况下,强行加入面试,以此争取工作机会的求职策略。以下将以3000字左右的篇幅,通过生动形象的例子详细解释这一战术。 一、背景介绍 在当今竞争激烈的就业市场中,求职者需要经历网申…...
【网络安全】注册流程:电子邮件验证绕过
未经许可,不得转载。 文章目录 正文步骤1:修改电子邮件参数步骤2:拦截请求正文 目标:https://app.example.me 注册新账户时,需要输入邮箱进行注册,再在邮箱中验证链接。电子邮件验证链接如下所示: https://app.example.me/signup/activation?token=c6dc625e-5b5a-46…...
Spring和Spring Boot事务讲解和案例示范
引言 Spring框架提供了强大的事务管理支持,使得开发者能够更轻松地实现事务控制。在本篇文章中,我们将深入探讨Spring的事务管理机制,特别是编程式事务管理、声明式事务管理以及在多数据源环境下的事务处理。 第一章 编程式事务管理 编程式…...
前端的全栈混合之路Meteor篇:关于前后端分离及与各框架的对比
这篇属于番外,属于技术性的讨论文,主要谈一下可能困惑不少人的问题。meteor看似一个前后端混合的框架,但实际上它并不是前后端混合的,只是共享了一个数据结构(数据对象)。现实中很多团队都说是前后端分离的…...

OJ在线评测系统 微服务 OpenFeign调整后端下 nacos注册中心配置 不给前端调用的代码 全局引入负载均衡器
OpenFeign内部调用二 4.修改各业务服务的调用代码为feignClient 开启nacos注册 把Client变成bean 该服务仅内部调用,不是给前端的 将某个服务标记为“内部调用”的目的主要有以下几个方面: 安全性: 内部API通常不对外部用户公开,这样可以防止…...
QD1-P19 HTML 总结
本节简单总结:《前端学习笔记1》专题前18篇文章关于HTML的内容。 下一节开始学习CSS了。HTML还是挺易学的,比Linux命令容易。 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p19 在前面18节中,我们了解了HTML的基础知识: …...

Android Framework AMS(03)AMS关键类解读
该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要涉AMS的关键类及其设计理念的解读,主要关注图中下方AMS关键类解读部分即可。这么做的目的是为了后面章节分析AMS时更容易理解…...
Pygame开发贪吃蛇
Pygame专为Python设计,支持多平台(如Windows、Mac OS X、Linux、Android等),提供简单易用的API来创建2D游戏。它不仅仅局限于游戏开发,还可用于图形界面和音频应用。 Pygame提供了简洁的API,使得开发者可以…...

Linux进程间通信(个人笔记)
Linux进程通信 1.进程通信介绍1.1进程间通信目的1.2进程间通信发展1.3进程间通信的具体分类 2.管道2.1匿名管道2.1.1代码实例2.1.2 fork共享管道原理2.1.3 管道的读写规则与特点2.1.4 进程池 2.2 命名管道2.2.1 命名管道的创建2.2.2匿名管道与命名管道的区别2.2.3代码实例 3.Sy…...
SAP S/4HANA 迁移:IT 高管实用指南
新版《通往SAP S/4HANA之路》指南为计划从SAP ERP或SAP S/4HANA本地版本迁移到云端的组织提供了全面的参考。随着数字化转型的加速,尤其是在面临挑战的汽车行业等领域,企业必须采用云ERP解决方案,例如SAP S/4HANA云私有版,以应对瞬…...

Qt源码-Qt多媒体音频框架
Qt 多媒体音频框架 一、概述二、音频设计1. ALSA 基础2. Qt 音频类1. 接口实现2. alsa 插件实现 一、概述 环境详细Qt版本Qt 5.15操作系统Deepin v23代码工具Visual Code源码https://github.com/qt/qtmultimedia/tree/5.15 这里记录一下在Linux下Qt 的 Qt Multimedia 模块的设…...

卸载PLSQL及标准卸载流程
目录 1. 卸载PLSQL2. 删除注册表3. 删除数据信息 1. 卸载PLSQL 等待进度条走完 2. 删除注册表 regedit 右击删除 3. 删除数据信息 由于AppData是隐藏文件,需要勾选隐藏的项目。 重启电脑,PLSQL就卸载成功了。...

如何使用ssm实现办公OA系统0
TOC 10907ssm办公OA系统10907ssm0 第一章 绪 论 1.1背景及意义 系统管理也都将通过计算机进行整体智能化操作,对于办公OA系统所牵扯的管理及数据保存都是非常多的,例如管理员;主页、个人中心、公司公告管理、设备分类管理、办公设备管理、…...

IPguard与Ping32—选择合适的企业数据保护解决方案
在数字化时代,企业面临着各种数据安全挑战,选择合适的保护工具至关重要。IPguard与Ping32是两款备受关注的数据保护软件,但它们各自的功能和适用场景有所不同,企业在选择时需根据自身需求做出明智决策。 Ping32:全面的…...

2024 kali虚拟机安装教程,分两大步骤,图文讲解(2)
准备工作: 按照图文讲解(1)搭建好虚拟机,继续以下步骤 2024 kali虚拟机安装教程,分两大步骤,图文讲解(1)-CSDN博客 正式开始 1.开启,↑ ↓ 方向键,选择第一…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...