当前位置: 首页 > news >正文

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

相关文章:

C语言(指针)1

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注收藏,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记&#x…...

perl:用 MIDI::Simple 生成midi文件,用 pygame 播放 mid文件

在 csdn.net 下载 strawberry-perl-5.32.1.1-64bit.zip 解压安装在 D:\Strawberry\ 运行 cpan install MIDI::Simple D:\Strawberry\c\bin\gmake.exe test -- OK Running make install for CONKLIN/MIDI-Perl-0.84.tar.gz Installing D:\Strawberry\perl\site\lib\MIDI.pm I…...

数据库-脏读

脏读(Dirty Read)是数据库并发控制中的一个概念,指的是一个事务读取了另一个尚未提交的事务的修改。由于另一个事务的修改可能最终会被撤销(即发生回滚操作),因此,当前事务读取到的数据可能是“…...

react 用合计项

在React中,如果你想要计算一个数组中的所有项目,你可以使用reduce方法。这是一个JavaScript内置的数组方法,它允许你累计数组中的值。 以下是一个简单的React组件示例,它计算一个商品列表中所有商品的总价: import…...

IP 地址追踪工具促进有效的 IP 管理

网络 IP 地址空间的结构、扫描和管理方式因组织的规模和网络需求而异,网络越大,需要管理的 IP 就越多,IP 地址层次结构就越复杂。因此,如果没有 IP 地址管理(IPAM)解决方案,IP 资源过度使用和地…...

快手蓝V商家电话采集软件操作教程

抖音作为全球最受欢迎的短视频平台之一,拥有庞大的用户基础。其中不乏拥有蓝V认证的大V用户,他们的手机号码对于一些市场营销人员来说是非常有价值的。但是,抖音并没有公开这些大V用户的手机号码,怎样采集到他们的手机号码呢&…...

工业机器人应用实践之玻璃涂胶(篇二)

工业机器人 接上篇文章,浅谈一下实践应用,具体以玻璃涂胶为例: 了解工业机器人在玻璃涂胶领域的应用认识工具坐标系的标定方法掌握计时指令的应用掌握人机交互指令的应用掌握等待类指令用法(WaitDI、WaitUnitl 等)认…...

C++ 455. 分发饼干

文章目录 一、题目描述二、参考代码 一、题目描述 示例 1: 输入: g [1,2,3], s [1,1] 输出: 1 解释: 你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。 虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩…...

未来娱乐新地标?气膜球幕影院的多维体验—轻空间

在中国,一座独特的娱乐场所正在崭露头角:气膜球幕影院。这个融合了气膜建筑与激光投影技术的创新场所,不仅令人惊叹,更带来了前所未有的科幻娱乐体验。让我们一起探索这个未来的娱乐空间,感受其中的多维魅力。 现场演出…...

工业机器人应用实践之玻璃涂胶(篇三)

工业机器人 接上篇文章,浅谈一下实践应用,具体以玻璃涂胶为例: 了解工业机器人在玻璃涂胶领域的应用 认识工具坐标系的标定方法 掌握计时指令的应用 掌握人机交互指令的应用 掌握等待类指令用法(WaitDI、WaitUnitl 等&#xff0…...

基于Huffman编码的字符串统计及WPL计算

一、问题描述 问题概括: 给定一个字符串或文件,基于Huffman编码方法,实现以下功能: 1.统计每个字符的频率。 2.输出每个字符的Huffman编码。 3.计算并输出WPL(加权路径长度)。 这个问题要求对Huffman编码算…...

处理VS2022中(C/C++)scanf报错问题(3种)

#pragma warning(disable:4996)//第一种&#xff1a;处理scanf在VS2022中报错 #define _CRT_SECURE_NO_WARNINGS//第二种:处理scanf在VS2022中报错 #include<bits/stdc.h> using namespace std; int main() { int a, b; scanf(“%d %d”, &a, &b);//第三种&…...

C#面:Session 喜欢丢值且占内存,Cookis不安全,请问 C# 可以用什么办法代替这两种原始的方法

可以使用 用 ViewState&#xff0c;stateserver。 在 C# 中&#xff0c;ViewState、StateServer 和 Session 都是用于在 Web 应用程序中存储和管理状态信息的机制。它们可以用来在不同的页面之间传递数据或者在同一页面的不同请求之间保持数据的持久性。 ViewState&#xff1…...

Python并发编程 05 锁、同步条件、信号量、线程队列、生产者消费者模型

文章目录 一、基础概念二、同步锁三、线程死锁和递归锁四、同步条件&#xff08;event&#xff09;五、信号量六、线程队列&#xff08;queue&#xff09;1、常用方法2、queue模块的三种模式&#xff08;1&#xff09;FIFO队列&#xff08;2&#xff09;LIFO队列&#xff08;3&…...

UIKit之UIButton

功能需求&#xff1a; 点击按钮切换按钮的文字和背景图片&#xff0c;同时点击上下左右可以移动图片位置&#xff0c;点击加或减可以放大或缩小图片。 分析&#xff1a; 实现一个UIView的子类即可&#xff0c;该子类包含多个按钮。 实现步骤&#xff1a; 使用OC语言&#xf…...

阿里云VOD视频点播流程(2)

二、视频点播 1、入门代码 基于OSS原生SDK上传 &#xff0c;参考文档&#xff1a;https://help.aliyun.com/zh/vod/user-guide/upload-media-files-by-using-oss-sdks?spma2c4g.11186623.0.0.1f02273fj4lxNJ 视频点播面向开发者提供了丰富的上传方式&#xff0c;其中上传SDK&…...

在Ubuntu上搭建幻兽帕鲁服务器

简介 幻兽帕鲁是一款多人在线角色扮演游戏&#xff0c;玩家可以捕捉和训练各种各样的幻兽&#xff0c;并与其他玩家进行战斗和交易。如果您想拥有自己的幻兽帕鲁服务器&#xff0c;可以按照以下步骤在 Ubuntu 上进行搭建。 准备工作 在开始之前&#xff0c;您需要准备以下几…...

Java中常用类String的不可变性详解

目录 一、String类的概述 二、String不可变性的原理 三、String不可变性的优点 四、String不可变性的缺点及解决方案 五、总结 一、String类的概述 在Java中&#xff0c;String类是一个代表字符串的类。它是Java核心API的一部分&#xff0c;用于处理文本数据。String对象…...

uniapp 自定义App UrlSchemes

需求&#xff1a;外部浏览器H5页面&#xff0c;跳转到uniapp开发的原生app内部。 1、uniapp内部的配置&#xff1a; &#xff08;1&#xff09;打开manifest->App常用其他设置&#xff0c;如下&#xff0c;按照提示输入您要设置的urlSchemes&#xff1a; &#xff08;2&am…...

MSP430环境搭建

1.下载ccs编译器 注意&#xff1a;安装路径和工作路径不能出现中文&#xff01; 没有说明的步骤就点next即可&#xff01; 1.1下载适合自己电脑的压缩包。 下载好压缩包后解压&#xff0c;点击有图标进行安装。 1.2创建一个文件夹用于安装编译器位置 选择安装地址&#xff0…...

【Qt C++实现蓝牙互联】

在 Qt C++ 中实现蓝牙互联可以通过 Qt 的蓝牙模块来实现。下面是一个简单的示例,演示如何在 Qt C++ 中使用蓝牙模块进行蓝牙互联,实现搜索设备、连接设备等功能。 // main.cpp #include <QCoreApplication> #include <QBluetoothDeviceDiscoveryAgent> #include…...

AI绘画已如此厉害,为何我们仍需学习绘画?

在这个AI技术日新月异的时代&#xff0c;AI绘画能力的大幅提升已经不是什么新鲜事。它们以惊人的速度和惊人的精细度完成作品&#xff0c;让不少人感叹&#xff1a;“这是不是意味着&#xff0c;未来绘画将完全由AI接管&#xff0c;人类的创作将变得无足轻重&#xff1f;”在这…...

Android 实现背景图片不被拉伸的效果 9-patch图片 .9图

今天碰到个需求&#xff0c;要求不同手机分辨率背景照片不能被拉伸&#xff0c;除了调用系统方法计算当前屏幕大小这个方法外还有一个就是9-patch图片&#xff0c;可以实现除了icon剩下的部位被缩放。 方法&#xff1a;资源文件右击找到9-patch&#xff0c;转为XXX.9.png照片 …...

Java EE/Jakarta EE范畴一览

Java EE&#xff08;Java Platform, Enterprise Edition&#xff09;现在已经改名为Jakarta EE&#xff0c;是一套用于开发企业级应用的标准Java平台。它扩展了Java SE&#xff08;Standard Edition&#xff09;&#xff0c;添加了支持大规模、多层次、可靠、安全、可伸缩和可管…...

洛谷 P3391:文艺平衡树 ← Splay树模板题

【题目来源】https://www.luogu.com.cn/problem/P3391【题目描述】 您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一个有序数列。 其中需要提供以下操作&#xff1a;翻转一个区间&#xff0c;例如原有序序列是 5 4 3 2 1&#xff0c;翻转区间…...

【高校科研前沿】北师大陈晋教授团队在遥感顶刊发表最新成果:ClearSCD模型:在高空间分辨率遥感影像中综合利用语义和变化关系进行语义变化检测

01文章简介 论文名称&#xff1a;The ClearSCD model: Comprehensively leveraging semantics and change relationships for semantic change detection in high spatial resolution remote sensing imagery&#xff08;ClearSCD模型&#xff1a;在高空间分辨率遥感影像中综合…...

关于YOLO8学习(五)安卓部署ncnn模型--视频检测

教学视频地址 B站 前文 关于YOLO8学习(一)环境搭建,官方检测模型部署到手机 关于YOLO8学习(二)数据集收集,处理 关于YOLO8学习(三)训练自定义的数据集 关于YOLO8学习(四)模型转换为ncnn 简介 本文将会讲解: (1)使用前文生成的ncnn模型,部署到安卓端,并且实…...

从哪些方面可以看出光伏的未来发展好?

光伏发电是一种基于半导体材料的光伏效应将太阳光转化为直流电能的发电技术。近年来&#xff0c;随着全球对可再生能源和环境保护的关注度不断提升&#xff0c;光伏发电行业发展迅速&#xff0c;成为未来能源领域的重要发展方向。 首先&#xff0c;从能源角度来看&#xff0c;光…...

VBA_MF系列技术资料1-605

MF系列VBA技术资料1-605 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-0…...

算法题① —— 数组专栏

1. 滑动窗口 1.1 长度最小的子数组 力扣&#xff1a;https://leetcode.cn/problems/minimum-size-subarray-sum/description/ int minSubArrayLen(int s, vector<int>& nums) {int result INT32_MAX; int sum 0; // 子序列的数值之和int subLength 0; // 子序列…...