C语言(指针)1

                       Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注+收藏,欢迎欢迎~~     

                        💥个人主页:小羊在奋斗

                        💥所属专栏:C语言   

        本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为同样是初学者的学友展示一些我的学习过程及心得。文笔、排版拙劣,望见谅。 

                                1、内存和地址

                                                1.1内存

                                                1.2编址

                                2、指针变量和地址

                                                2.1取地址操作符和指针变量

                                                2.2解引用操作符 “ * ”

                                                2.3指针变量的大小

1、内存和地址 

        1.1内存

        理解内存和地址,我们可以把它们类比为宿舍楼和房间编号。宿舍楼有大有小,大一点的宿舍楼较小一点的宿舍楼可以居住更多的学生,同样的,计算机的内存也是有大有小,我们常见的有8G、16G、32G等,更大的内存能存储更多的信息。

        宿舍楼的编号是为了更方便的管理学生,为学生提供便利,同样的,为了更高效的管理内存,内存也被划分为一个个小的内存单元,每个内存单元的大小是一个字节,一个字节中有8个比特位。

        这里需要注意一点,单一个比特位是没有地址的,只有一个内存单元才有一个地址,这就像我们在学校住宿舍,学校基本不可能给我们一人一个宿舍,而是4人或6人寝。

        所以,每个内存单元,就类似于学生宿舍,一个 “字节宿舍” 里能住 “8个比特同学” 。宿舍有门牌号,内存单元也有 “门牌号”,就是内存地址编号,有了这个内存单元的编号,CPU就能快速的找到这个内存空间,对其相应的操作。

        生活中,门牌号叫地址,在计算机中内存单元的编号也叫地址。在C语言中还给地址起了一个新的名字,叫做指针。可以粗略的认为:地址就是指针,指针就是地址

         1.2编址

        CPU访问某个内存单元,先要知道其地址,因为内存空间很大,所以需要给内存单元编址。编址并不是把每个字节的地址记录下来,而是通过硬件来实现,就像琴键上并没有标上这个键是什么音,但是学过钢琴的人却能弹奏曲子,这是因为制造这架钢琴前其界内就约定了每个键该是什么音,计算机编址也是如此。

        我们可以简单地理解,32位机器有32根地址总线,每根线有两个形态,0或1(电脉冲的有无),一根线能表示两种信息,那么32根线就能表示2的32次方种信息,这个数还是非常大的。地址信息被下达给内存,CPU在内存上就能找到该地址对应的数据,将数据通过数据总线传给CPU内的寄存器。

        计算机中并没有魔法,其内有很多的硬件单元,硬件单元之间协同工作,要想协同,就要进行数据传递。但硬件与硬件之间是相互独立的,怎么通信呢?答案很简单,就是用线连起来。而CPU和内存之间也是要交互数据的,两者也要用线连起来。本节只关心地址总线。 

2、指针变量和地址 

        2.1取地址操作符和指针变量 

        如上,创建变量实质上是向内存申请一块内存空间,上面我们申请了4个字节的空间来存20这个值。可以看到右边0x010FF9B0~0x010FF9B3就是我们申请到的4个字节的地址,每个字节都有地址,存放了14 00 00 00(16进制)这个值(10进制为20)。 

        看了上面的内容,这里有一个提问,变量 “a” 对于上面代码的执行有什么作用?其实仔细想想好像也没有什么作用。变量的名字仅仅是给程序员看的,编译器不看名字,编译器是通过地址找内存单元的

        我们给变量a申请了4个字节的内存空间,通过取地址操作符 “&” 我们可以拿到地址值。但是a占4个字节的空间,地址有4个, “&” 操作符拿到的是4个还是其中的一个呢?

        可以看到,“&” 操作符只取到了最小的一个地址,不过当我们拿到这个 “头” 的时候,就能顺藤摸瓜找到其他地址。

        值得一说的是,当 “&” 是单目操作符的时候,它是取地址操作符;当 “&” 是双目操作符的时候,它是按位与操作符。

        当我们拿到变量a的地址后,如果我们想把变量a的地址存起来,就需要再创建一个变量,而用来存放地址的变量,就叫指针变量。 既然是变量,就要有一个类型来创建,指针变量的类型取决于它所指对象的类型。

        这里定义了一个整型的指针变量 “pa”,注意是 “pa” 而不是 “ *pa ”,指针变量 “pa” 是用来存放地址的。 pa是指针变量的名字,而int *是pa的类型。* 表示pa是指针变量,int表示pa指向的对象的类型为int。* 靠近int还是靠近pa是无所谓的,但是建议靠近pa,具体原因在后面的文章中会有解释。

        上面为指针变量pa与整型变量a比较。 

        还有一点需要注意,当我们写出 int *p = 100;这样的表达式的时候,就把100也看作了一个地址。p作为一个指针变量,在它眼里给它的值都是地址。

 2.2解引用操作符“ * ”

        当 “ * ” 是单目操作符的时候,它是解引用操作符,也叫间接访问操作符;当 “ * ” 是双目操作符的时候,它是乘法操作符

        将变量a的地址存到指针变量pa中,可以在某些时候通过pa来找到a或者间接的操作a。这就像我们的朋友告诉了我们他的宿舍门牌号,我们记下来后,想去找他的时候就可以快速地找到他。那该怎么找a呢?用解引用操作符 “ * ” :

        *pa就相当于a。 我们用*pa间接的改变了a的值。

        那这么做的意义是什么呢?想改变a的值我们直接改不就可以了,为什么还要用*pa来间接的改呢?

        这么做的意义其实是很大的。打个比方,一个杀手在常年的任务中越来越厉害,他就成立了一个杀手组织做了老大,他作为老大是很重要的人物,那这个时候一些任务他就不方便亲自出手了,交给手下就可以完成任务。指针在上面代码中的意义也是如此,使得代码更加灵活。

        作为C语言的灵魂,指针是C语言中功能最强大的机制,在后续的学习中就会慢慢地理解其中的含义。

         2.3指针变量的大小

        在探讨指针变量的大小前我们应该先搞清楚指针变量是干什么的。指针变量,是为了存放地址而创建的一个变量,那么指针变量的大小有多大,是不是就取决于这个地址有多大。

        在32位机器中,有32根地址线,32根地址线有32个0或1的数字信号,把这32根地址线产生的2进制序列当作一个地址,那么一个地址就要32个比特位,也就是4个字节。所以,指针变量的大小就应该是4个字节。同样的道理,在64位机器中,指针变量的大小就应该是8个字节。

         有没有注意到我在描述指针变量大小的时候并没有明确说明指针变量的类型,而是总体的说指针变量的大小。实际上,指针变量的大小与指针的类型没有关系。地址是由地址总线传过来的,而地址总线的数量是确定的,32根地址总线或64根地址总线,对应4个字节和8个字节的大小,不管是整型变量的地址还是字符型变量的地址都是地址,所以大小是一样的。

        还有一点,前面说了 “&” 操作符取到的只是首地址(最小的地址),所以不管地址是1个字节还是4个字节还是8个字节,只要取出首地址就可以了。

        关于指针变量的大小和不同类型变量所占空间大小,我们可以抽象地想象为一个固定大小的盒子装不同大小的小盒子,大小就那么大,不用白不用嘛。 

        如果觉得我的文章还不错,请点赞、收藏 + 关注支持一下,我会持续更新更好的文章。 

                                          点击跳转下一节—> C语言(指针)2

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

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

相关文章

前端笔记-day03

文章目录 01-初始CSS02-CSS引入方式03-标签选择器04-类选择器05-id选择器06-通配符选择器07-画盒子08-字体大小09-文字粗细10-字体倾斜11-行高12-行高垂直居中13-字体族14-font复合属性15-文本缩进16-文本对齐方式17-图片对齐方式18-文本修饰线19-文字颜色20-调试工具21-综合案…

容器监控与日志管理

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、Docker监控工具 二、容器日志工具docker logs 三、第三方日志工具 四、容器日志驱动 五、示例 5.1、查看容器中运行的进程的信息 5.2、查看…

SOCKET编程(4):SOCKET实战

SOCKET实战 Writen()、Readn()函数 send()函数存在需要发送的字符数len小于函数返回的已发送的字符数(ssize_t)的问题 recv()函数存在需要接收的字符数len小于函数返回的已接收的字符数(ssize_t)的问题 解决上述问题通过Writen()、Readn()函数实现 //buff是数据存储地址&a…

在Leaflet中点对象使用SVG和Canvas两种模式的对比

目录 前言 一、关于SVG和Canvas 1、SVG知识 2、Canvas知识 3、优缺点 二、SVG和Canvas在Leaflet的使用 1、相关类图 2、Leaflet的默认展示方式 三、SVG和Canvas实例及性能对比 1、SVG模式及性能对比 2、Canvas优化 总结 前言 众所周知,在Leaflet当中&#…

用于视频识别的快慢网络

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读:用于视频识别的快慢网络1、文献摘要2、提出方法2.1、SlowFast模型2.2、SlowFast 提出思想 3、相关方法3.1、时空间卷积3.2、基于光…

深入解析RedisSearch:全文搜索的新维度

码到三十五 : 个人主页 在当今的数据时代,信息的检索与快速定位变得尤为关键。Redis,作为一个高性能的内存数据库,已经在缓存和消息系统中占据了重要地位。然而,Redis并不直接支持复杂的搜索功能。为了填补这一空白&am…

零代码平台助力中国石化江苏油田实现高效评价体系

概述: 中国石化集团江苏石油勘探局有限公司面临着评价体系依赖人工处理数据、计算繁琐且容易出错的挑战。为解决这一问题,他们决定借助零代码平台明道云开发江苏油田高质量发展经济指标评价系统。该系统旨在实现原始数据批量导入与在线管理、权重及评分…

Redis单机安装

1.编译 cd redis安装目录 makemake install2.修改配置文件redis.conf #端口修改 port 6379 #后台进程启动 yes daemonize yes # daemonize no #注释掉 为了可以远程连接 #bind 127.0.0.1 #设置密码 requirepass pwd3.启动 ./redis-server ../redis.conf查看进程 [rootlocal…

【Linux】从零开始认识动静态库 -动态库

送给大家一句话: 我不要你风生虎啸, 我愿你老来无事饱加餐。 – 梁实秋 《我把活着欢喜过了》 ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭…

【小红书采集软件】根据关键词批量爬取小红书笔记正文、笔记链接、发布时间、转评赞藏等

一、背景介绍 1.1 爬取目标 熟悉我的小伙伴可能了解,我之前开发过2款软件: 【GUI软件】小红书搜索结果批量采集,支持多个关键词同时抓取! 【GUI软件】小红书详情数据批量采集,含笔记内容、转评赞藏等,支…

用大于meilisearch-java-0.7.0.jar的报错的解决

Elasticsearch 做为老牌搜索引擎,功能基本满足,但复杂,重量级,适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需求,极快,单文件,超轻量。 所以,对于中小型项目来说…

数组元素翻倍C++

编写一个 C 程序&#xff0c;实现一个功能&#xff0c;即将数组中的每个元素值翻倍。程序应定义一个函数 doubleArray&#xff0c;该函数接收一个整数数组的指针和数组的大小&#xff0c;然后将数组中的每个元素都翻倍。 代码 #include <iostream>void doubleArray(int…

Rust使用HashSet对Vec类型的元素进行去重

在Rust语言中&#xff0c;对Vec类型的元素进行去重&#xff0c;一种常见的方法是使用一个HashSet来帮助我们快速检查元素是否已经存在。以下是使用HashSet对Vec进行去重的示例代码&#xff1a; use std::collections::HashSet;fn main() {let vec_numbers vec![1, 2, 2, 3, 4…

Softing工业推出的edgeConnector将Allen-Bradley控制器集成到工业边缘应用中

2024年4月17日&#xff08;哈尔&#xff09;&#xff0c;Softing宣布扩展其基于Docker的edgeConnector产品系列&#xff0c;推出了新软件模块edgeConnector Allen Bradley PLC&#xff0c;可方便用户访问来自ControlLogix和CompactLogix控制器数据。 &#xff08;edgeConnector…

i春秋-Test

题目 解题 参考WP https://blog.csdn.net/qq_40654505/article/details/107142533/目录扫描 复现wp payload为&#xff1a; search.php?searchtype5&tid&areaeval($_POST[cmd])使用蚁剑连接 http://eci-2ze4iyhwj7xvb68bsb2t.cloudeci1.ichunqiu.com:80/search.ph…

TikTok机房ip好还是住宅ip好?

住宅ip比较好&#xff0c;机房数据中心IP高效、低价&#xff0c;所以使用的人多且用处复杂&#xff0c;这类ip极大可能存在滥用的黑历史&#xff0c;通过此类ip访问tiktok&#xff0c;被禁止的可能性更高&#xff0c;更容易被拉入黑名单。所以我们推荐tiktok独享原生ip搭建节点…

AI写作推荐-写文ai-AI在线写作生成器-3步完成写作任务

AI写作利器&#xff1a;推荐几款神助攻文案创作工具 随着技术的进步&#xff0c;人工智能&#xff08;AI&#xff09;已达到高级水平&#xff0c;在众多领域展现其强大能力。 在文本创作的领域&#xff0c;人工智能&#xff08;AI&#xff09;应用已显著地提升了写作效率和创意…

java--io流(二)

一、打印流&#xff08;PrintStream[字节]、PrintWriter[字符]&#xff09; &#xff08;基本上可以代替前面所学的字节、字符输出流&#xff09;&#xff0c;二者关于打印数据功能相同&#xff08;都方便且高效&#xff09;&#xff0c;但是关于数据写出不同&#xff0c;前者…

上位机图像处理和嵌入式模块部署(树莓派4b和qt应用全屏占有)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们都知道&#xff0c;嵌入式应用一般都是为了某一个特定应用而存在的。也就是说&#xff0c;和pc不同&#xff0c;这个嵌入式板子一般都是为了解…

图像ISP——AGC参数解析

前言 AWB和AGC是两种常见的自动调整功能。AWB用于自动调整图像的白平衡&#xff0c;以确保颜色在不同光照条件下仍然看起来自然。而AGC则用于自动调整图像的增益&#xff0c;以在不同的亮度条件下保持适当的曝光。 代码例程 static AWB_AGC_TABLE_S g_stAwbAgcTable {/* bvali…