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

news2024/11/22 11:04:44

文章目录

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


前言

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


一、内存和地址

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

内存

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

假设有一栋宿舍楼,把你放在楼里,楼上有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.coloradmin.cn/o/2123398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Netty权威指南:Netty总结-客户端创建

第十四章 客户端创建 14.1 Netty客户端创建流程分析 BootStrap是socket客户端创建工具类,通过Bootstrap可以方便地创建Netty客户端发起异步TCP连接操作 14.1.1 客户端创建时序图 14.1.2 客户端流程分析 用户线程创建BootStrap实例,通过API设置创建客…

Linux 网络基础概念

文章目录 一、初始协议1、理解2、协议分层3、软件分层4、OSI七层模型5、TCP/IP五层模型 二、再识协议1、为什么要有TCP/IP协议2、什么是TCP/IP协议3、TCP/IP协议与操作系统的关系(宏观上,怎么实现的) 三、网络传输基本流程1、mac地址2、TCP/I…

Django 模型索引的创建

在 Django 中,索引是优化数据库查询性能的重要工具。Django 提供了多种方式来为模型字段创建索引,比如通过字段选项或直接在模型的 Meta 类中定义。下面详细介绍如何在 Django 中为模型创建索引。 1、问题背景 在 Django 中,当我们需要对模型…

浅谈人工智能之Python调用AutoGen Studio SDK

浅谈人工智能之Python调用AutoGen Studio SDK 引言 在之前的文档中我们讲解了如何搭建AutoGen Studio环境以及基于AutoGen Studio构建AI Agent并且进行执行。 今天我们介绍如何通过Python调用AutoGen Studio提供的SDK来运行workflow,即AI Agent。 实例说明 第一步:我们使…

国产ERT/ECT工业电阻/电容层析成像系统在多相流领域的应用

层析成像技术,是通过射线扫描与反演计算,重建物体内部结构的图像,广泛应用于工业领域。其中,电学成像技术作为层析成像的重要分支,具备无辐射、响应快、成本低等优势。它通过对被测物体施加电学激励并检测边界测量值变…

计算机专业选题推荐-基于uniapp的共享电子图书管理微信小程序

💖🔥作者主页:毕设木哥 精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻 实战项目 文章目录 实战项目 一、基于uniapp的共享电子图书管…

linux驱动学习笔记(linux驱动头文件说明) include asm等目录下头文件功能_在linux中文件中的include表示什么

#include<linux/device.h>//包含了device、class 等结构的定义 #include <linux/io.h>//包含了ioremap、iowrite等内核访问IO内存等函数的定义。 #include<linux/miscdevice.h>//包含了miscdevice结构的定义及相关的操作函数。 #include<linux/interru…

NLTK:一个强大的自然语言处理处理Python库

我是东哥&#xff0c;一名热爱技术的自媒体创作者。今天&#xff0c;我将为大家介绍一个非常有趣且强大的Python库——NLTK。无论你是刚刚接触Python的小白&#xff0c;还是对自然语言处理&#xff08;NLP&#xff09;有些许了解的朋友&#xff0c;NLTK都是一个值得学习的工具。…

web项目如何部署到服务器上并运行呢?——使用Tomcat插件

三、使用Tomcat插件 这种方式是在web项目种集成tomcat&#xff0c;所以不用部署web项目了&#xff0c;只需要直接启动服务器就可以了。 1、集成tomcat插件 &#xff08;1&#xff09;在pom.xml文件中添加tomcat插件&#xff1a; <build><plugins><!--Tomcat…

2024 全新智能识别 API 接口震撼登场

近年来&#xff0c;随着人工智能技术的快速发展&#xff0c;智能识别技术逐渐成为了各个领域的热门应用。在这个大背景下&#xff0c;2024 年的全新智能识别 API 接口横空出世&#xff0c;为我们的生活带来了更多的便利。本文将为大家详细介绍这个全新智能识别 API 接口&#x…

Linux之Shell命令

Shell 是一个 C 语言编写的脚本语言&#xff0c;它是用户与 Linux 的桥梁&#xff0c;用户输入命令交给 Shell 处理&#xff0c;Shell 将相应的操作传递给内核&#xff08;Kernel&#xff09;&#xff0c;内核把处理的结果输出给用户。 程序执行方式&#xff1a;编译、解释 Sh…

vue国际化vue-i18n搭配i18n-ally实现多语言国际化

i18n-ally 是一款 VS Code 插件&#xff0c;为开发者提供了一套强大而简便的工具&#xff0c;以轻松实现国际化&#xff08;i18n&#xff09;。本文将介绍如何使用 i18n-ally 插件&#xff0c;实现应用程序的多语言支持。 一:安装vscode插件。 首先&#xff0c;在 Visual Stu…

JVM 体系与结构

目录 一次编译导出运行 JVM不只是虚拟机, 更是一个平台 虚拟机? Java虚拟机? JVM在计算机系统中所处的位置 JVM的体系结构 Java代码的执行流程 JVM生命周期 一次编译导出运行 在以前, java是编程语言里面的巨头: 在tiobe里面的排名如下: 但是随着大数据以及人工…

【南京工业大学主办,JPCS出版】自动化、电气控制系统与设备

&#x1f308;2024年自动化、电气控制系统与设备国际学术会议&#xff08;AECSE 2024&#xff09;是致力于将“自动化与电气”领域的专家学者、研发者和技术人员汇集一堂的国际盛会。会议将于2024年10月18-20日在中国南京举行。 &#x1f308;会议的主旨是为相关领域的从业者及…

算法练习题19——leetcode141环形链表

题目描述 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&a…

利用R语言进行头条主页内容的自动化下载

对于互联网内容的自动化抓取&#xff0c;R语言提供了强大的工具和库来帮助我们实现这一目标。本文将介绍如何使用R语言进行头条主页内容的自动化下载&#xff0c;包括必要的库安装、代理服务器的配置、HTTP请求的发送、内容的解析和保存。 R语言简介 R语言是一种用于统计计算…

vue3开发uniapp转字节小程序注意事项

vue3开发uniapp转字节小程序注意事项 1.provide-inject 跨层通信不支持问题2.不能自定义头部&#xff0c;需要去申请 开发相关地址 1.抖音开放平台 2.开发者平台 项目本身是vue3tsuniapp写的微信小程序&#xff0c;因产品需求要转换成抖音小程序 1.provide-inject 跨层通信不支…

树莓派3B点灯(1)-- 四种方法

先做个简单一丢丢的吧。。。正好最近工作也要用这个。这次直接给够四种方法&#xff0c;给好给满。分别是Python点&#xff0c;用户空间配置GPIO点&#xff0c;设备树配置内核Leds驱动点&#xff0c;自己写驱动点。 用的板子是树莓派3B&#xff0c;GPIO 26口&#xff0c;蓝光L…

Linux环境基础开发工具使用(1)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux环境基础开发工具使用(1) 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 Linux…

Java实现常见的工厂模式(包含在Springboot中实战开发)

Java实现工厂模式 文章目录 Java实现工厂模式1. 概念2. 工厂模式的三种实现方式2.1 简单工厂模式1.定义产品接口2. 实现具体产品类3. 实现简单工厂类4. 客户端代码5.运行结果 2.2 工厂方法模式1. 定义产品接口2. 实现具体产品类3. 创建工厂接口4. 实现具体工厂类5. 客户端代码6…