C语言(指针)1

news2024/11/17 14:33:43

                       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.coloradmin.cn/o/1664549.html

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

相关文章

推荐全网最全的AI小白进阶指南

1. 引言 您想学习人工智能?但不知道如何开始,也不知道从哪里开始?互联网上的资源总是丰富多彩,质量参差不齐,往往容易看花眼而无从下手。 鉴于此,本文重点推荐一些个人收集的还不错的一些资源供大家学习参…

两重惊喜!奥特曼预告GPT-4和ChatGPT重大更新,Open AI要放大招

OpenAI在今天官宣13日(下周一10点)开启线上直播,将会展示全新的ChatGPT demo的演示以及GPT-4的重大更新! OpenAI首席执行官Sam Altman在X上表示,这些的发布会,公司不会宣布下一代对话式人工智能GPT-5或人工…

日报表定时任务优化历程

报表需求背景 报表是一个很常见的需求,在项目中后期往往会需要加多种维度的一些统计信息,今天就来谈谈上线近10个月后的一次报表优化优化之路(从一天报表跑需要五分钟,优化至秒级) 需求:对代理商进行日统计…

示例十一、声音传感器

通过以下几个示例来具体展开学习,了解声音传感器原理及特性,学习声音传感器的应用(干货版): 示例十一、声音传感器 ino文件源码: //Arduino C demo void setup() {Serial.begin(9600);pinMode(5, OUTPUT); }void loo…

瑞友天翼应用虚拟化系统SQL注入漏洞

文章目录 漏洞描述漏洞原理影响版本漏洞复现防御方法 漏洞描述 瑞友天翼应用虚拟化系统是基于服务器计算架构的应用虚拟化平台,它将用户各种应用软件集中部署到瑞友天翼服务集群,客户端通过 WEB 即可访问经服务器上授权的应用软件,实现集中应…

一文搞懂反射,还有谁不懂,直接甩给他

Hi,大家好,我是抢老婆酸奶的小肥仔。 反射,在我们日常开发中无时无刻,被大量运用在框架代码和工具代码中,反射可以通俗点讲就是一个类的自我剖析,通过反射可以获取到这个类所有信息,包括:属性&…

mysql数据库:read_me_recover_tn勒索恢复---惜分飞

最近有客户被MySQL删库勒索,现象如下:1. 删除掉以前的库,并创建一个同名库,并且会创建一个read_me_recover_tn库,类似下图: 2. 在read_me_recover_tn库中有一个readme表,每个被删除然后创建的库里面也有一个readme表 3. 每个readme表内容类似信息类似: mysql> desc read…

操作系统基础之磁盘

概述 基本概念 磁盘有正反两个盘面,每个盘面有多个同心圆,每个同心圆是一个磁道,每个同心圆又被划分为多个扇区,数据就被存在扇区中。 磁头首先寻找到对应磁道,然后等到磁盘进行周期旋转到指定的扇区,才…

Colab/PyTorch - 003 Transfer Learning For Image Classification

Colab/PyTorch - 003 Transfer Learning For Image Classification 1. 源由2. 迁移学习(ResNet50)2.1 数据集准备2.2 数据增强2.3 数据加载2.4 迁移学习2.5 数据集训练&验证2.6 模型推理 3. 总结4. 参考资料 1. 源由 迁移学习已经彻底改变了 PyTorch 中处理图像分类的方式…

shared_ptr 引用计数相关问题

前言 智能指针是 C11 增加的非常重要的特性,并且也是面试的高频考点,本文主要解释以下几个问题: 引用计数是怎么共享的、怎么解决并发问题的资源释放时,控制块的内存释放吗weak_ptr 怎么判断对象是否已经释放 文中源码用的是 L…

从零自制docker-12-【overlayfs】

文章目录 overlayfsexec.Command("tar", "-xvf", busyboxTarURL, "-C", busyboxURL).CombinedOutput()exec.Command格式差异 挂载mount卸载unmount代码地址结果演示 overlayfs 就是联合文件系统,将多个文件联合在一起成为一个统一的…

【VTKExamples::Rendering】第五期 环形阵列Rotations

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例环形阵列Rotations,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. Rotations

程序环境和预处理、编译链接过程、编译的几个阶段、运行环境、预定义符号等的介绍

文章目录 前言一、程序的翻译环境和执行环境二、编译链接过程三、编译的几个阶段四、运行环境五、预定义符号总结 前言 程序环境和预处理、编译链接过程、编译的几个阶段、运行环境、预定义符号的介绍。 一、程序的翻译环境和执行环境 在 ANSI C 的任何一种实现中&#xff0c…

DDR5和LPDDR4/5 命令解析

关键名称介绍 DDR5 SDRAM和LPDDR4/5都采用了高级的命令集来支持更高效的内存管理和操作,其中“Multi-purpose command (MPC)”、“Mode Register Read (MRR)”、“Mode Register Write (MRW)”,以及“Write Pattern Command”是几种关键的命令类型,它们在内存初始化、配置和…

力扣 5-11

704. 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 这道题目的前提是数组为有序数组,同时题目还强…

028.实现 strStr()

题意 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 难度 简单 示例 例 1 输入:hays…

Java----数组的定义和使用

1.数组的定义 在Java中,数组是一种相同数据类型的集合。数组在内存中是一段连续的空间。 2.数组的创建和初始化 2.1数组的创建 在Java中,数组创建的形式与C语言又所不同。 Java中数组创建的形式 T[] 数组名 new T[N]; 1.T表示数组存放的数据类型…

1290.二进制链表转整数

给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。 请你返回该链表所表示数字的 十进制值 。 示例 1: 输入:head [1,0,1] 输出:5 解释:二进制数 (101) 转化为十进制…

静态住宅代理 IP 的影响

在不断发展的在线业务和数字营销领域,保持领先地位势在必行。在业界掀起波澜的最新创新之一是静态住宅代理 IP 的利用。这些知识产权曾经是为精通技术的个人保留的利基工具,现在正在成为各行业企业的游戏规则改变者。 一、静态住宅代理IP到底是什么&…

LeetCode/NowCoder-链表经典算法OJ练习1

目录 说在前面 题目一:移除链表元素 题目二:反转链表 题目三:合并两个有序链表 题目四:链表的中间节点 SUMUP结尾 说在前面 dear朋友们大家好!💖💖💖数据结构的学习离不开刷题…