指针(笔记1)

一、内存和地址

内存及其管理方法:

1.计算机主存储器由一个一个存储单元组成,微型计算机以字节作为存储单元

2.内存区的每一个字节有一个唯一的编号,这就是“地址”,它相当于教学楼中的教室号

3.内存地址,是一个无符号整数(unsigned int) , 它是一个以当前系统寻址范围为取值范围的整数

4.主存储器的所有存储单元的地址是连续的

5.在32位系统下,由于使用的是32位地址,其寻址能力也就是地址空间为4G的字节,0-2的32次方-1

 

内存被划分为一个个的单元,一个内存单元的大小是一个字节

注意:内存单元的地址与内存单元中的数据是两个完全不同的概念

 

二、指针:

1.在程序中定义了一个变量,对程序进行编译时,系统会给这个变量分配内存单元

2.编译系统根据程序中定义的变量类型,分配一定长度的空间:

每个字符变量分配1个字节

每个整型变量分配4个字节

3.一个变量占用存储区域的所有字节都有各自的地址,C系统把该变量在存储区域中第一个字节的地址作为此变量的地址

4.由于通过地址可以找到所需的变量单元,可以说, 地址指向该单元,将地址形象化的称为指针

af55105f54004916abeb3433a3c3a391.jpg

 内存单元的编号=地址=指针

 

三、编址:

339242c826384f138a92a2afc2aa7fef.jpg

32位机器有32根地址总线,每根线只有两态,表示0,1【电脉冲有/无】,那么一根线,就能表示2种含义,2根线就能表示4种含义,依次类推。32根地址线,就能表示2^32种含义,每一种含义都代表一个地址

地址信息被下达给内存,在内存上,就可以找到该地址对应的数据,将数据在通过数据总线传入CPU内寄存器。

 

四、取地址操作符(&)

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

1ec67b9b777d4e22a55d4cb6d1a4e1cf.jpg

上述的代码就是创建了整型变量a,内存中申请4个字节,用于存放整数10

取地址操作符(&)的使用:

82ece0b503af4327b2e3004912cb6dce.jpg

这里%p是专门用于打印地址的

0301d7c9aa514285beaabdcd9361f4a4.jpg

结果是以16进制的形式输出的

虽然整型变量占用4个字节,我们只要知道了第一个字节地址,顺藤摸瓜访问到4个字节的数据也是可行的。

 

 

 

五、指针变量的定义和引用操作符(*)

如: int* pl,*p2;

  与int *pl, p2;

int* 表示指向整型数据的指针类型,读作"指向int的指针"或简称"int指针"

指针变量名是pl,p2,不是*pl,*p2

指针变量只能指向定义时所规定类型的变量

指针变量定义后,变量值不确定,应用前必须先赋值

c59a0579f43044998afd12751499dadd.jpg

第五行中: *是在说明pa是指针变量

                 int表示pa指向的对象是int类型的

再比如:char* pc=&ch;                                     则表示有一个char类型的变量ch,ch的地址存放在指针变量pc中

pa是指针变量,是专门用于存放地址的,地址又被称为指针,指针变量是用来存放指针的

指针变量也是一种变量,只要是存放在指针变量中的值都会被理解为地址

 

 

 

六、解引用操作符

d6d03b46169649e683c3d69f08a2a4f0.jpg

 2051f170d8eb45c8b2a6b0d2cba47259.jpg

上面代码就使用了解引用操作符*pa 的意思就是通过pa中存放的地址,找到指向的空间,*pa等价于a变量,即*pa==a

所以*pa=20 这个操作就是把a改成了0.

这里如果目的就是把a改成20的话,写成a= 20; 不就完了,为啥非要使用指针呢?

其实这里是把a的修改交给了pa来操作,这样对a的修改,就多了一种的途径,写代码就会更加灵活,后期慢慢就能理解

 

 

 

七、指针变量的大小

前面的内容我们了解到,32位机器假设有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产生的2进制序列当做一个地址,那么一个地址就是32个bit位,需要4个字节才能存储。

如果指针变量是用来存放地址的,那么指针变的大小就得是4个字节的空间才可以。

同理64位机器,假设有64根地址线,一个地址就是64个二进制位组成的二进制序列,存储起来就需要8个字节的空间,指针变量的大小就是8个字节

指针变量的大小取决于地址的大小

32位平台下地址是32个bit位(即4个字节)

64位平台下地址是64个bit位(即8个字节)

f98d3ba2ca1d47c3ac1c11516dc118ba.jpg

 

 

 

 

八、指针的解引用

eae76905c71043d7a278ec1b56ca484f.jpg

3d71b0d4a2c24bb2b23d3693bdeb89cb.jpg 

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

比如:char*的指针解引用就只能访问一个字节,而int*的指针的解引用就能访问四个字节。

80ff19472263479781655fe3193e8dc9.jpg

 结果为:

3ae7efdec4d94b27b2f0a497ec27db79.jpg

 

 

 

九、指针+整数

对pa和pc加一后:

dd5d8f830a8c4d77b3aebe7f299fb820.jpg

 结果为:

c713df8ecd1b41c185583c9e759ba4dd.jpg

 b52349a4356d4354aba1717b237309f8.jpg

我们可以看出,char*类型的指针变量+1跳过1个字节int*类型的指针变量+1跳过了4个字节。这就是指针变量的类型差异带来的变化。

结论:指针的类型决定了指针向前或者向后走一步有多大(距离)。

 

通过该方法我们可以将数组中的每一个元素变成1

如下:

ec296386fe32493a964064b6b4132017.jpg

 结果为:

c46c7f40ad4440de83fe89263ae3a6d2.jpg

 

 

 

九、void指针

在指针类型中有一种特殊的类型是void*类型的,可以理解为无具体类型的指针(或者叫泛型指针),这种类型的指针可以用来接受任意类型地址

但是也有局限性, void*类型的指针不能直接进行指针的+﹣整数和解引用的运算。

举例:

f2236e6a36c446f789ab7ed30045d6c6.jpg

7282443ca98d4bc8bab1b078e6248710.jpg

 运行上面的代码时,将一个int类型的变量的地址赋值给一个char*类型的指针变量。编译器给出了一个警告,是因为类型不兼容。而使用void*类型就不会有这样的问题。

 

fdc555d9759e40b0b81283237ea80e82.jpg

 788c7e00e4264b408b8d19d2deca3c06.jpg

这里我们可以看到,void*类型的指针可以接收不同类型的地址,但是无法直接进行指针运算,比如进行解引用操作和+-整数

一般void*类型的指针是使用在函数参数的部分,用来接收不同类型数据的地址,这样的设计可以实现泛型编程的效果。

 

结论: 一个指针变量只能指向同类型的变量。如果给指针赋值时,=号右边的指针类型与左边的指针类型不同,则需要进行类型强制转换。

 

比如:

0fbfde6b81a449c0bcd3881cd13b9aba.jpg

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/235216.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

04.仿简道云公式函数实战-QLExpress基础语法

1. 前言 小伙伴大家好,在上一篇文章我们简单初探了QLExpress表达式引擎,我们简单写了一个HelloWorld的程序,并成功的运行期望的结果。在本篇文章中我们来熟悉一下QLExpress的语法,因为我们在后面简道云公式实战的时候&#xff0c…

java之SpringBoot开发实用篇

MENU SpringBoot开发实用篇KF-1.热部署KF-1-1.手动启动热部署KF-1-2.自动启动热部署KF-1-3.参与热部署监控的文件范围配置KF-1-4.关闭热部署 KF-2.配置高级KF-2-1.ConfigurationPropertiesKF-2-2.宽松绑定/松散绑定KF-2-3.常用计量单位绑定KF-2-4.校验KF-2-5.数据类型转换 KF-3…

MFC CLXHHandleEngine动态库-自定义设置对话框使用

实现的效果如下所示: void CSampleDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 CSgxMemDialog dlg(180, 100); dlg.SetEnable(true); dlg.SetWindowTitle(_T("自定义对话框")); dlg.AddStatic(1000, //控件资源…

Sbatch, Salloc提交任务相关

salloc 申请计算节点,然后登录到申请到的计算节点上运行指令; salloc的参数与sbatch相同,该部分先介绍一个简单的使用案例;随后介绍一个GPU的使用案例;最后介绍一个跨节点使用案例; 首先是一个简单的例子&a…

SpringBoot整合ZXing创建二维码和条形码

文章目录 1、引入依赖2、Service层实现3、Controller4、效果 之前SpringSecurity时,登录用到了图片验证码辅助登录:【 整合hutool实现集成图片验证码】,以下为整合zxing实现二维码和条形码的生成。 1、引入依赖 引入ZXing依赖的坐标&#x…

探索未来新趋势:鸿蒙系统的崭新时代

探索未来新趋势:鸿蒙系统的崭新时代 随着科技的不断发展,操作系统作为计算机和移动设备的核心,扮演着至关重要的角色。近年来,一种备受瞩目的操作系统——鸿蒙系统(HarmonyOS)崭露头角,正引领着…

Servlet学习笔记

简介 浏览器请求处理流程:浏览器发请求 > 服务器tomcat( > 应用程序 ( > servlet) ) Servlet应用的三大作用域:request,session,application tomcat存放项目的层级结构 注释:servlet原引用包名 javax.serv…

城市道路积水如何有效预警?内涝积水监测仪效果

在城市中道路积水是一个常见的问题,特别是在暴雨季节还可能形成城市内涝。为了解决这个问题建立一个有效的预警系统是至关重要的。城市内涝积水监测仪应该能够实时监测道路积水情况,并及时向后台工作人员发出警报,以便他们能够采取适当的措施…

mysql中的DQL查询

表格为: DQL 基础查询 语法:select 查询列表 from 表名:(查询的结果是一个虚拟表格) -- 查询指定的列 SELECT NAME,birthday,phone FROM student -- 查询所有的列 * 所有的列, 查询结果是虚拟的表格&am…

【Spring教程23】Spring框架实战:从零开始学习SpringMVC 之 SpringMVC简介与SpringMVC概述

目录 1,SpringMVC简介2、SpringMVC概述 欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》&…

LANDSAT_7/02/T1/RAW的Landsat7_C2_RAW类数据集

Landsat7_C2_RAW是指Landsat 7卫星的数据集,采用的是Collection 2级别的数据处理方法,对应的是Tier 1级别的原始数据(RAW)。该数据集包括了Landsat 7卫星从1999年4月15日开始的所有数据,共涵盖了全球范围内的陆地和海洋…

【开源】基于Vue和SpringBoot的森林火灾预警系统

项目编号: S 019 ,文末获取源码。 \color{red}{项目编号:S019,文末获取源码。} 项目编号:S019,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 系统基础模块2.3 烟…

Aligning Large Multi-Modal Model with Robust Instruction Tuning

Abstract 尽管多模态任务取得了有希望的进展,但当前的大型多模态模型(LMM)很容易产生与相关图像和人类指令 不一致的描述的幻觉。 LRV-指令。我们通过引入第一个大型且多样化的视觉指令调整数据集来解决这个问题,该数据集名为大…

【项目实现】ResShift:通过残差位移实现图像超分辨率的高效扩散模型(NeurIPS 2023,聚焦)

基于扩散的图像超分辨率(SR)方法主要受到数百甚至数千个采样步骤要求导致推理速度低的限制。现有的加速度采样技术不可避免地在一定程度上牺牲了性能,导致SR结果过于模糊。为了解决这个问题,我们提出了一种新颖而高效的SR扩散模型…

天池SQL训练营(四)-集合运算-表的加减法和join等

-天池龙珠计划SQL训练营 4.1表的加减法 4.1.1 什么是集合运算 集合在数学领域表示“各种各样的事物的总和”, 在数据库领域表示记录的集合. 具体来说,表、视图和查询的执行结果都是记录的集合, 其中的元素为表或者查询结果中的每一行。 在标准 SQL 中, 分别对检索结果使用 U…

AWS Ubuntu设置DNS解析(解决resolve.conf被覆盖问题)

众所周知: Ubuntu在域名解析时,最直接使用的是/etc/resolve.conf文件,它是/run/systemd/resolve/resolve.conf的软链接,而对于刚装完的ubuntu系统,该文件的内容如下 ubuntuip-172-31-36-184:/etc$ cat resolv.conf #…

02-Nacos和Eureka的区别与联系

Nacos和Eureka的区别 联系 Nacos和Eureka整体结构类似: 都支持服务注册, 服务拉取, 采用心跳方式对服务提供者做健康监测的功能 区别 Nacos支持服务端主动检测服务提供者状态: 临时实例采用心跳模式,非临时实例采用主动检测模式但对服务器压力比较大(不推荐) 心跳模式: 服务…

华为数通方向HCIP-DataCom H12-831题库(多选题:161-180)

第161题 以下关于IS-IS路由渗透的描述,正确的有哪些项? A、若要配置Level-2区域的路由向Level-1区域渗透,则需要在Level-1设备上配置命令import-routeisis level_-2 into level_-1 B、缺省情况下,Level-2区域无Level-1区域的路由信息,需要通过在Level-1-2设备上配置impor…

PPT插件-好用的插件-插入媒体-大珩助手

批量媒体 包含批量视频、批量音频、批量图片,可实现从光标所在的位置开始,每页插入一个视频、一个音频、一张图片,且图片和视频的尺寸与当前幻灯片尺寸一致 插入文本 包含黑字无底、白字红底、白字黛底、白字绿底、白字蓝底预设一键文本&am…

C++12.5

想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴子等。现在,动物园里有一位讲解员,他会为每种动物表演做简单的介绍。 在这个场景中,我们可以将动物比作是不同的类,而每种动物表演则…