(C语言)深入理解指针1基础

指针是C语言中的一个难点,但如果真正理解了指针,其实没有很难,本篇文章介绍了指针的基础知识,后面还会继续更行指针的内容。感谢支持。

目录

1. 内存和地址

1.1 内存

1.2 究竟该如何理解编址

2. 指针变量和地址

2.1 取地址操作符(&)

2.2 指针变量和解引⽤操作符(*)

2.2.1 指针变量

2.2.2 如何拆解指针类型

2.2.3 解引⽤操作符

2.3 指针变量的⼤⼩

3. 指针变量类型的意义

3.1 指针的解引⽤

3.2 指针+-整数

3.3 void* 指针

4. const修饰指针

4.1 const修饰变量

4.2 const修饰指针变量

5. 指针运算

5.1 指针+- 整数

5.2 指针-指针

5.3 指针的关系运算


1. 内存和地址

1.1 内存

CPU( 中央处理器) 在处理数据的时候 ,需要的数据是在内存中读取的 ,处理后的数   据也会放回内存中 ,那我们买电脑的时候  电脑上内存是8GB/16GB/32GB等 内存划分为一个个的内存单元 ,每个内存单元的大小取1个字节,方便高效管理。

计算机中常见的单位

其实每个内存单元都有自己的唯一确定的编号,通过这个编号,CPU就可以快速,找到对应的内存空间,这个编号也就是地址,在C语言中也有一个名字叫作:地址。

我们可以理解为:内存单元的编号==地址==指针

1.2 究竟该如何理解编址

CPU访问内存中的某个字节空间 ,必须知道这个 字节空间在内存的什么位置 ,而因为内存中字节很多 ,所以需要给内存进行编址(就如同宿舍很 ,需要给宿舍编号一样)。

计算机中的编址 ,并不是把每个字节的地址记录 下来 ,而是通过硬件设计完成的。

首先 ,必须理解 ,计算机内是有很多硬件单元,而硬件单元是要互相协同工作的。所谓的协 ,至少相互之间要能够进行数据传递。

但是硬件与硬件之间是互相独立的 ,那么如何通信呢?答案很简单 ,用"线"连起来。

而CPU和内存之间也是有大量的数据交互的 ,所 ,两者必须也用线连起来。

不过 ,我们今天关心一组线 ,叫做地址总线

我们可以简单理解,32位机器有32根地址总线,每根线只有两态 ,表示0或1【电脉冲有无】 ,那么一根线 ,就能表示2种含义 ,2根线就能表示4种含  ,依次类推。32根地址线 ,就能表示2^32种含   ,每一种含义都代表一个地址。

地址信息被下达给内存 ,在内存上 ,就可以找到该地址对应的数据 ,将数据在通过数据总线传入 CPU内寄存器。

2. 指针变量和地址

2.1 取地址操作符(&)

理解了内存和地址的关系,我们再回到C语⾔,在C语⾔中创建变量其实就是向内存申请空间,

我们知道C语言中一个整形占4个字节,创建时会向内存申请4字节的空间,当取整形变量的地址时会取出4个字节地址的第一个地址,因为知道是int类型,当需要这个变量时就能顺藤摸瓜,将这4个字节全部访问。

2.2 指针变量和解引⽤操作符(*)

2.2.1 指针变量

在这里p就是指针变量,int*是指针变量类型,p变量里存放的是变量a的地址。

2.2.2 如何拆解指针类型

其实int* p理解为:int是p指针变量所指向的变量的类型。

              *理解为:告诉我们p是指针变量。

              p理解为:指针变量的名字。

如果是char类型的数据:

2.2.3 解引⽤操作符

我们得到了一个变量的地址,将他存在了一个指针变量中,我们这样做有什么用呢?

我们可以通过地址找到这个地址所指向的变量。来操作,改变它。我们必须要用到解引用操作符:*。

*pa=0;相当于通过pa中存放的地址找到了这个a变量,并把a赋值为0;

我们因为可以看到打印a与打印*pa的结果是一样的。

2.3 指针变量的⼤⼩

前⾯的内容我们了解到,32位机器假设有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产⽣的2进制序列当做⼀个地址,那么⼀个地址就是32个bit位,需要4个字节才能存储。
如果指针变量是⽤来存放地址的,那么指针变的⼤⼩就得是4个字节的空间才可以。
同理64位机器,假设有64根地址线,⼀个地址就是64个⼆进制位组成的⼆进制序列,存储起来就需要8个字节的空间,指针变的⼤⼩就是8个字节。

我们可以分别看一下在X86(32位)和X64(64位)下打印地址大小的结果:

32位下的结果:

64位下的结果:

可以看到在同一环境下不同类型的地址所占内存的大小是相同的,也就是说地址无贵贱,所占内存大小都遵循下面的规律:

32位平台下地址是32个bit位,指针变量⼤⼩是4个字节
64位平台下地址是64个bit位,指针变量⼤⼩是8个字节
注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,⼤⼩都是相同的。

3. 指针变量类型的意义

3.1 指针的解引⽤

代码一:

代码二:

代码一是将int*类型强制类型转变成了char*类型,解引用时只访问了一个字节将44变成了00

而代码二int*类型的pi解引用访问了四个字节,将n全变为0;

结论:指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。
⽐如: char* 的指针解引⽤就只能访问⼀个字节,⽽ int* 的指针的解引⽤就能访问四个字节。

3.2 指针+-整数

我们可以看出, char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节。
这就是指针变量的类型差异带来的变化。
结论:指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)。

3.3 void* 指针

在指针类型中有⼀种特殊的类型是 void* 类型的,可以理解为⽆具体类型的指针(或者叫泛型指
针),这种类型的指针可以⽤来接受任意类型地址。但是也有局限性, void* 类型的指针不能直接进⾏指针的+-整数和解引⽤的运算。
举例:
将⼀个int类型的变量的地址赋值给⼀个char*类型的指针变量。编译器给出了⼀个警
告,是因为类型不兼容。⽽使⽤void*类型就不会有这样的问题。
但是void*并不是万能的:
这⾥我们可以看到, void* 类型的指针可以接收不同类型的地址,但是⽆法直接进⾏指针运算。
那么 void* 类型的指针到底有什么⽤呢?这里有一篇博客可以参考,使用在了函数传参上面
(C语言)qsort函数模拟实现: http://t.csdnimg.cn/FMB3k

4. const修饰指针

4.1 const修饰变量

变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的也可以修改这个变量。
但是如果我们希望⼀个变量加上⼀些限制,不能被修改,怎么做呢?这就是const的作⽤
上面代码中m被const修饰了不能再被修改了,
但是如果我们绕过m直接通过地址去修改m也是可以的。
我们可以看到这⾥⼀个确实修改了,但是我们还是要思考⼀下,为什么m要被const修饰呢?就是为了不能被修改,如果p拿到m的地址就能修改m,这样就打破了const的限制,这和我们的想法是不一样的,所以应该让p拿到m的地址也不能修改m,那接下来怎么做呢?

4.2 const修饰指针变量

总结: const修饰指针变量的时候
const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。
但是指针变量本⾝的内容可变。
const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容不能修改,但是指针指
向的内容,可以通过指针改变。

5. 指针运算

指针的基本运算有三种,分别是:
指针+- 整数
指针-指针
指针的关系运算

5.1 指针+- 整数

因为数组在内存中是连续存放的,只要知道第⼀个元素的地址,顺藤摸⽠就能找到后⾯的所有元素。
我们通过运用地址访问了数组中所有的元素,并打印出来。

5.2 指针-指针

5.3 指针的关系运算

C语言中指针的知识多而复杂,可能有的地方写的不明白,欢迎在评论区讨论。
感谢观看,感谢指正错误。

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

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

相关文章

深入探索HTTP/3协议:核心原理、创新优势与实战部署细节

引言 在互联网技术演进的过程中,HTTP协议扮演着至关重要的角色,它是现代Web应用程序通信的基础。自HTTP/1.1引入持久连接和管道化,再到HTTP/2引入多路复用,每一次迭代都是对网络传输效能的一次提升。如今,HTTP/3作为新…

计算机的基础知识

计算机的特点及应用: 图灵说–计算就是基于规则的符号串变换从20世纪80年代开始,发达国家开始研制第五代计算机,研究的目标是能够打破以往计算机固有的体系结构,使计算机能够具有像人一样的思维、推理和判断能力,向智…

重要通告 | 公司更名为“浙江实在智能科技有限公司”

更名公告 升级蜕变、砥砺前行 因业务快速发展和战略升级,经相关政府机构批准,自2024年3月1日起,原“杭州实在智能科技有限公司”正式更名为“浙江实在智能科技有限公司”。 更名后,公司统一社会信用代码不变,业务主体…

共享文件如何异地部署?

在现代信息化的时代背景下,不同地区之间的文件共享和异地部署是一项重要的任务。共享文件异地部署可以有效提高文件传输的效率,方便不同地区间的合作与协同工作。本文将介绍共享文件异地部署的概念、挑战以及解决方案。 天联组网的作用 天联组网是一种用…

chromedriverUnable to obtain driver for chrome using ,selenium找不到chromedriver

1、下载chromedriver chromedriver下载网址:CNPM Binaries Mirror 老版本在:chromedriver/ 较新版本在:chrome-for-testing/ 2、设置了环境变量还是找不到chromedriverUnable to obtain driver for chrome using NoSuchDriverException:…

上海亚商投顾:沪指震荡微涨 AI手机、军工板块集体走强

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日低开后震荡回升,黄白二线分化明显,银行等权重板块走势较强。AI手机概念股持续…

如何应对IT服务交付中的问题?看了本文DevOps就懂了

👨‍🎓博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…

Maven入门(作用,安装配置,Idea基础maven,Maven依赖,Maven构建项目)【详解】

目录 一. Maven的作用 1.依赖管理 2.统一项目结构 3.项目构建 二.Maven安装配置 1. Maven的仓库类型 2 加载jar的顺序 3. Maven安装配置 4.安装Maven 5.配置仓库 三.idea集成maven 1.给当前project集成maven 2.给新建project集成maven 3.创建maven项目 4.pom…

Web安全:报错注入原理分析,报错注入步骤,报错注入常用函数

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全自学教程》 报错注入 一、什么是报错注入二、执行原理1. 代码逻辑…

okHttp MediaType MIME格式详解

一、介绍 我们在做数据上传时,经常会用到Okhttp的开源库,okhttp开源库也遵循html提交的MIME数据格式。 所以我们经常会看到applicaiton/json这样的格式在传。 但是如果涉及到其他文件等就需要详细的数据格式,否则服务端无法解析 二、okHt…

【ESP32 IDF快速入门】点亮第一个LED灯与流水灯

文章目录 前言一、有哪些工作模式?1.1 GPIO的详细介绍1.2 GPIO的内部框图输入模式输出部分 二、GPIO操作函数2.1 GPIO 汇总2.2 GPIO操作函数gpio_config配置引脚reset 引脚函数设置引脚电平选中对应引脚设置引脚的方向 2.3 点亮第一个灯 三、流水灯总结 前言 ESP32…

MybatisPlus入门详解

一、MyBatisPlus 简介 1.1 创建新模块 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version></dependency> 由于mp并未被收录到idea的系统内置配置,无法…

点胶缺陷视觉检测都是怎么检测的?

点胶工艺是许多工业生产中不可或缺的一环&#xff0c;而点胶缺陷的存在往往直接影响到产品质量。为了提升点胶工艺的品质控制&#xff0c;点胶缺陷的视觉检测成为了一个重要的技术手段。 一、点胶缺陷的类型 点胶缺陷主要包括胶点大小不均、位置偏移、漏点、多点等。这些缺陷如…

【详识JAVA语言】String类oj练习

1. 第一个只出现一次的字符 class Solution { public int firstUniqChar(String s) {int[] count new int[256];// 统计每个字符出现的次数for(int i 0; i < s.length(); i){count[s.charAt(i)];}// 找第一个只出现一次的字符for(int i 0; i < s.length(); i){if(1 …

Vue项目实战--空间论坛(1)

环境准备 安装好node.js,Vue后 添加插件 router---路由&#xff0c;多页面的应用 vuex---在多个组件之间维护同一个数据 添加依赖 bootstrap---美工 popperjs/core vue项目介绍 views-----对应vue文件&#xff0c;页面 router-----路由&#xff0c;页面&#xff0c;c…

Hack The Box-Perfection

目录 信息收集 nmap dirsearch gobuster whatweb WEB 信息收集 ffuf 漏洞探索 漏洞发现 模板注入 反弹shell 提权 get user and flag 信息收集 ssh登录&get root and flag 信息收集 nmap 端口探测┌──(root㉿ru)-[~/kali/hackthebox] └─# nmap -p- 10…

【系统安全加固】Centos 设置禁用密码并打开密钥登录

文章目录 一&#xff0c;概述二&#xff0c;操作步骤1. 服务器端生成密钥2. 在服务器上安装公钥3.下载私钥到本地&#xff08;重要&#xff0c;否则后面无法登录&#xff09;4. 修改配置文件&#xff0c;禁用密码并打开密钥登录5. 重启sshd服务6. 配置xshell使用密钥登录 一&am…

腾讯QQ推出AI聊天搭子;零一万物01AI宣布开源Yi-9B模型

&#x1f989; AI新闻 &#x1f680; 腾讯QQ推出AI聊天搭子&#xff0c;进军AI对话领域 摘要&#xff1a;腾讯QQ合作筑梦岛和混元助手&#xff0c;推出了AI对话功能“AI聊天搭子”&#xff0c;提供多种虚拟角色与用户实时互动&#xff0c;目前已开启测试。此外&#xff0c;抖…

详细分析Corn表达式(附Demo)

目录 前言1. 基本知识2. Demo 前言 主要来源是定时任务的执行时间&#xff0c;通过XXL-Job来设定&#xff0c;相关知识推荐阅读&#xff1a; 详细分析Java中的分布式任务调度框架 XXL-Jobjava框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09…

log4j日志

目录 pom中的依赖 log4j.properties 在mybatis配置文件中 pom中的依赖 <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency> log4j.properties #将等级为DEBUG…