C语言深入了解指针一(14)

文章目录

  • 前言
  • 一、内存和地址
    • 内存
    • 究竟该如何理解编址
  • 二、指针变量和地址
    • 取地址操作符&
    • 解引用操作符*
    • 指针变量的大小
  • 总结


前言

  终于来到指针啦!如前篇末尾总结所说,这是你们马上要下大功夫的地方
  但是,就像我们上初中的时候,有人说函数难;我们上高中的时候,有人说导数、圆锥难;上大学的时候,有人说微积分难,事实上,别被吓到了,先勇敢尝试,迈过去了也就那么回事~


一、内存和地址

脱离内存和地址讲指针就是耍流氓!

内存

在讲解之前,先来个比方:

假设有一栋宿舍楼,把你放在楼里,楼上有100个房间,但是房间没有编号,你的一个朋友来找你玩,如果他想找到你,就得挨个房子去找,这样效率很低,但是我们根据楼层和楼层的房间的情况,给每个房间上号,如:
一楼:100、101、102…
二楼:200、201、202…

有了房间号的话,你的朋友就能很快找到你

如果把这个例子对照到计算中,又是怎么样的呢?
我们知道,CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,那我们买电脑的时候,电脑上内存是8GB/16GB/32GB等,那么这些内存该如何高效管理?
其实也是把内存分为一个个内存单元,每个内存单元的大小为1个字节,一个比特位可以放一个二进制位的1或者0

在这里,每个内存单元就相当于是一个学生宿舍,一个人字节空间里面能放8个比特位,就好比同学们住的八人间,每个人是一个比特位,每个内存单元也都有一个编号(这个编号就相当于是宿舍房间的门牌号)有了这个内存单元的编号,CPU就可以快速找到一个内存空间

生活中,我们把门牌号叫做地址,在计算机中我们把内存单元的编号也称为地址,C语言给这个地址起了一个新的名字,就叫做指针

一言以蔽之,内存单元的编号 == 地址 == 指针
在这里插入图片描述

究竟该如何理解编址

首先,我们必须要理解,计算机中有很多的硬件单元,而硬件单元是要互相协同工作的,所谓的协同,至少相互之间能够进行数据传递
但是硬件与硬件之间是互相独立的,那么如何通信呢?答案很简单,用“线”连起来
而CPU和内存之间也是有大量的数据交互的,所以,两者必须也用线连起来
CPU访问内存中的某个字节空间,必须知道它在内存中的位置,而因为字节很多,所以需要编址(如同宿舍很多。必须要编号一样自然),并且,计算机中的编址,并不是把每个字节的地址记录下来,而是通过硬件设计完成的
钢琴,吉他上面没有写上“都瑞咪发嗦啦”这样的信息,但演奏者照样能够准确找到每一个琴弦的每一个位置,这是什么原因?因为制造商已经在乐器硬件层面设计好了,并且所有的演奏者都知道。这质是一种约定俗成的共识!
而硬件的编址也是一样,我们可以简单理解为,32位机器有32根地址总线,每根线只有两态,表示0,1(电脉冲的有无),那么一根线,就有了2种含义,2根线就能表示4种含义,依次类推,32根地址线就能表示232种含义,每一种含义都代表一个地址
地址的信息被下达给内存,在内存中,就可以找到该地址对应的数据,将数据在通过数据总线传入CPU内寄存器
在这里插入图片描述

二、指针变量和地址

取地址操作符&

理解了内存和地址的关系,我们再回到C语言,在C语言中创建变量其实就是向内存申请空间

比如:
在这里插入图片描述

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

0x000000109136F544
0x000000109136F545
0x000000109136F546
0x000000109136F547

那我们如何得到a的地址呢?
这里就得学习一个操作符&-取地址操作符
在这里插入图片描述

有意思的是,我们是如果&p打印a的地址,是打印出四个字节的地址中的首地址(低地址),也能理解,比如你家有四套房子,那你收一个快递的时候,也还是填一个地址,只要得到了首地址,其他三个地址也就很好求了

所以说&a是一个地址,那么假设变量pa = &a,那么pa是什么类型呢?
答案是int* ,即int* pa = &a; 其中pa就是指针变量,用来存放地址,即用来存放指针

我们也可以有一种形象的说法,pa指向a的第一个字节,这很形象,很有画面感
在这里插入图片描述

解引用操作符*

我们将地址保存起来,未来是要使用的,那怎么使用呢?
答案是在指针变量前面加个*

int a = 10;
int* pa = &a;
*pa = 20; // *是解引用操作符,*pa等价于a

pa就像一个代理人,联想到电视剧《狂飙》,强哥高启强想噶人,不能直接动手,跟老默说想吃鱼了,就是这个意思
至于你说为什么不直接a = 20; 难道计算机里面也会有类似安欣的存在限制了这一操作吗?哈哈,我们以后就会知道的,在这里先按下不表

指针变量的大小

指针变量是专门用来存放地址的,指针变量的大小是多少呢?取决于一个地址的存放需要多大空间!
在前面,我们了解到,32位机器假设有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产生的2进制序列当作一个地址,那么一个地址就是32个bit位,需要4个字节才能存储
同理64位机器,假设有64根地址线,一个地址就是64个二进制位组成的二进制序列,存储起来就需要八个字节(8 * 8 = 64),所以指针的大小都是4/8个字节

x86和x64环境下的输出结果:
在这里插入图片描述

32位平台下地址是32个bit位,指针变量大小是4个字节
64位平台下地址是64个bit位,指针变量大小是8个字节
注意指针变量的大小和类型是无关的,只要是指针类型的变量,在相同的平台下,大小都是相同的


总结

  指针我估计会出好几篇,第一篇就先不太难,也不太多,并且尽量以图形语言来展示,也卖了几个关子,回头见!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开发工具】IntelliJ IDEA插件推荐:Json Helper——让JSON处理更高效

导语:在Java开发过程中,JSON作为一种轻量级的数据交换格式,被广泛应用于前后端数据交互。今天,我要为大家介绍一款IntelliJ IDEA插件——Json Helper,帮助开发者更高效地处理JSON数据。 一、什么是Json Helper&#x…

智能优化算法-樽海鞘优化算法(SSA)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 樽海鞘优化算法 (Salp Swarm Algorithm, SSA) 虽然名称中提到的是“樽海鞘”,但实际上这个算法是基于群体智能的一种元启发式优化算法,它模拟了樽海鞘(Salps)在海…

C语言:刷题日志(3)

一.猴子选大王 一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不…

阿里云镜像报错 [Errno 14] HTTP Error 302 - Found 问题解决记录

1、问题背景和解决思路 在本地安装 CentOS7 后,网络已调通可正常上网,但切换阿里云镜像后,使用 yum 安装软件时出现 “[Errno 14] HTTPS Error 302 - Found Trying other mirror.” 报错,原因是 yum 源配置问题。给出了详细的解决…

苹果首款AI手机发布!iPhone 16全新AI功能体验感拉满

苹果于2024年秋季盛大发布iPhone 16系列,带来前所未有的AI智能体验。iPhone 16系列不仅硬件全面升级,更融入了尖端的AI技术,为用户带来更加智能化的生活体验。 在科技春晚的舞台上,苹果不负众望地揭开了iPhone 16系列的神秘面纱。…

ubuntu20.04 Qt6引用dcmtk库实现dicom文件读取和字符集转换

1 环境问题 安装完Qt6,新建Qt/QtQuick CMake工程编译出现如下错误: Found package configuration file: Qt6Config.cmake but it set Qt6 FOUND to FALSE so package "Qt6" is considered to be NOT FOUND. 原因: 这是因为系统中缺少OpenG…

缓存穿透、缓存雪崩、缓存击穿

图片没了,真的难受啊。。 缓存穿透 缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。 常见的解决方案有两种: 缓存空对象 优点:实现简单…

Java 入门指南:Java 并发编程 —— 同步工具类 CountDownLatch(倒计时门闩)

文章目录 同步工具类CountDownLatch常用方法使用步骤适用场景使用示例 同步工具类 JUC(Java.util.concurrent)是 Java 提供的用于并发编程的工具类库,其中包含了一些通信工具类,用于在多个线程之间进行协调和通信,特别…

uniapp媒体

uni.previewImage实现图片放大预览 // 图片预览函数function onPreview(index) {// 收集所有图片的urlvar urls pets.value.data.map(item > item.url)// 预览图片uni.previewImage({current: index, // 当前预览的图片索引urls: urls // 所有图片的url数组})}

大模型api谁家更便宜

1 openai 可点此链接查询价格:https://openai.com/api/pricing/ 2 百度 可点此链接查询价格:https://console.bce.baidu.com/qianfan/chargemanage/list 需要注意,百度千帆平台上还提供其他家的模型调用服务, 如llama, yi-34b等…

秋招突击——算法练习——9/4——73-矩阵置零、54-螺旋矩阵、48-旋转图像、240-搜索二维矩阵II

文章目录 引言复习新作73-矩阵置零个人实现 54-螺旋矩阵个人实现参考实现 48-旋转图像个人实现参考实现 240-搜索二维矩阵II个人实现参考实现 总结 引言 秋招开展的不是很顺利,还是要继续准备,继续刷算法!不断完善自己,希望能够找…

yolov5 +gui界面+单目测距 实现对图片视频摄像头的测距

可实现对图片,视频,摄像头的检测 项目概述 本项目旨在实现一个集成了YOLOv5目标检测算法、图形用户界面(GUI)以及单目测距功能的系统。该系统能够对图片、视频或实时摄像头输入进行目标检测,并估算目标的距离。通过…

揭开Facebook AI的神秘面纱:如何利用人工智能提升社交体验

人工智能(AI)正迅速成为推动技术进步的核心力量,而Facebook作为全球领先的社交媒体平台,正通过AI技术不断提升用户体验和平台功能。本文将深入探讨Facebook如何利用AI技术,优化社交互动、内容推荐和用户管理&#xff0…

Sentinel 使用案例详细教程

文章目录 一、Sentinel 使用1.1 Sentinel 客户端1.2 Sentinel 控制台1.3 客户端和控制台的通信所需依赖 二、测试 Sentinel 限流规则2.1 启动配置2.2 定义限流资源2.3 配置流量控制规则2.4 运行项目 三、 测试 Sentinel 熔断降级规则3.1 定义资源3.2 配置熔断降级规则3.3 运行项…

info_scan!自动化漏洞扫描系统,附下载链接

在我们团队的日常工作中,定期进行安全演练和漏洞扫描几乎是必不可少的。每次安全互动我们都需要对关键资产进行全面的安全评估,及时发现可能存在的安全隐患。 就在上周,我们针对几个主要服务进行了例行的漏洞扫描。在这个过程中,…

DevOps平台搭建过程详解--Gitlab+Jenkins+Docker+Harbor+K8s集群搭建CICD平台

一、环境说明 1.1CI/CD CI即为持续集成(Continue Integration,简称CI),用通俗的话讲,就是持续的整合版本库代码编译后制作应用镜像。建立有效的持续集成环境可以减少开发过程中一些不必要的问题、提高代码质量、快速迭代等;(Jenkins) CD即持续交付Con…

合宙低功耗4G模组Air780EX——硬件设计手册01

Air780EX是一款基于移芯EC618平台设计的LTECat1无线通信模组。支持FDD-LTE/TDD-LTE的4G远距离无线 传输技术。另外,模组提供了USB/UART/I2C等通用接口满足IoT行业的各种应用诉求。 一、主要性能 1.1 模块功能框图 1.2 模块型号列表 1.3 模块主要性能 *注: 模组…

Leetcode 最大子数组和

使用“Kadane’s Algorithm”来解决。 Kadane’s Algorithm 在每个步骤中都保持着一个局部最优解,即以当前元素为结尾的最大子数组和(也就是局部最优解),并通过比较这些局部最优解和当前的全局最优解来找到最终的全局最优解。 Kadane’s Algorithm的核…

巧用工具,Vue 集成 medium-zoom 实现图片缩放

文章目录 巧用工具,Vue 集成 medium-zoom 实现图片缩放介绍medium-zoomVue3集成 medium-zoom 示例Vue2集成 medium-zoom 示例进阶 - 可选参数 巧用工具,Vue 集成 medium-zoom 实现图片缩放 在现代网页开发中,为用户提供良好的视觉体验至关重…

K-Means聚类

聚类的作用: 知识发现 发现事物之间的潜在关系 异常值检测 特征提取 数据压缩的例子 有监督和无监督学习: 有监督: 给定训练集 X 和 标签Y 选择模型 学习(目标函数的最优化) 生成模型(本质上是一组参…