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

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 平时说的"指针"的两种理解方式

  1. 本质上 指针其实是地址 = 内存单元的编号 即内存单元的编号=地址=指针
  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函…...