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 等࿰…...
基于Huffman编码的字符串统计及WPL计算
一、问题描述 问题概括: 给定一个字符串或文件,基于Huffman编码方法,实现以下功能: 1.统计每个字符的频率。 2.输出每个字符的Huffman编码。 3.计算并输出WPL(加权路径长度)。 这个问题要求对Huffman编码算…...
处理VS2022中(C/C++)scanf报错问题(3种)
#pragma warning(disable:4996)//第一种:处理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,stateserver。 在 C# 中,ViewState、StateServer 和 Session 都是用于在 Web 应用程序中存储和管理状态信息的机制。它们可以用来在不同的页面之间传递数据或者在同一页面的不同请求之间保持数据的持久性。 ViewState࿱…...
Python并发编程 05 锁、同步条件、信号量、线程队列、生产者消费者模型
文章目录 一、基础概念二、同步锁三、线程死锁和递归锁四、同步条件(event)五、信号量六、线程队列(queue)1、常用方法2、queue模块的三种模式(1)FIFO队列(2)LIFO队列(3&…...
UIKit之UIButton
功能需求: 点击按钮切换按钮的文字和背景图片,同时点击上下左右可以移动图片位置,点击加或减可以放大或缩小图片。 分析: 实现一个UIView的子类即可,该子类包含多个按钮。 实现步骤: 使用OC语言…...
阿里云VOD视频点播流程(2)
二、视频点播 1、入门代码 基于OSS原生SDK上传 ,参考文档:https://help.aliyun.com/zh/vod/user-guide/upload-media-files-by-using-oss-sdks?spma2c4g.11186623.0.0.1f02273fj4lxNJ 视频点播面向开发者提供了丰富的上传方式,其中上传SDK&…...
在Ubuntu上搭建幻兽帕鲁服务器
简介 幻兽帕鲁是一款多人在线角色扮演游戏,玩家可以捕捉和训练各种各样的幻兽,并与其他玩家进行战斗和交易。如果您想拥有自己的幻兽帕鲁服务器,可以按照以下步骤在 Ubuntu 上进行搭建。 准备工作 在开始之前,您需要准备以下几…...
Java中常用类String的不可变性详解
目录 一、String类的概述 二、String不可变性的原理 三、String不可变性的优点 四、String不可变性的缺点及解决方案 五、总结 一、String类的概述 在Java中,String类是一个代表字符串的类。它是Java核心API的一部分,用于处理文本数据。String对象…...
uniapp 自定义App UrlSchemes
需求:外部浏览器H5页面,跳转到uniapp开发的原生app内部。 1、uniapp内部的配置: (1)打开manifest->App常用其他设置,如下,按照提示输入您要设置的urlSchemes: (2&am…...
MSP430环境搭建
1.下载ccs编译器 注意:安装路径和工作路径不能出现中文! 没有说明的步骤就点next即可! 1.1下载适合自己电脑的压缩包。 下载好压缩包后解压,点击有图标进行安装。 1.2创建一个文件夹用于安装编译器位置 选择安装地址࿰…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
