【c语言】指针小结

一、指针是什么?

可以通过运算符&来取得变量实际保存的 起始地址

(这个地址是虚拟地址,并不是真正物理内存上的地址。)

数据类型 *标识符 = &变量;

int *pa = &a; int *pa = NULL;

(NULL表示地址为0的内存空间,这个地址是无法使用的,读写该地址会报错)

pa 中存储的就是变量 a 的地址,也叫做指向 a 的指针。

int *a,b; 等价于 int *a;int b;而不等价于 int *a; int *b;

💡 变量的初始化!int *pa;
声明指针变量之后,编译器会为指针变量本身分配一个内存空间,但是这个内存空间里面的值是随机的,也就是说, 未初始化的指针变量指向的地址是随机的。 这时一定不能去读写指针变量指向的地址,因为那个地址是随机地址,很可能会导致严重后果。

  • 错误案例:*p = 1; 错误的,p指向的内存是随机的,不可以赋值
  • 正确案例: p = &a; *p = 1 正确的,此时p指向a的地址,可以为a赋值

💡 pa中存储的是a变量的内存地址,那如何通过地址去获取a的值呢?
这个操作就叫做解引用 比如*pa就能获得a的值。

二、指针的运算

指针仅在同一段内存中比较才有意义。指针本质上就是一个无符号整数,代表了内存地址。它可以进行运算,但是规则并不是整数运算的规则。

  1. 指针与整数值的加减运算
    指针与整数值的运算,表示指针的移动。

    int* i;
    i = (int *)0x0034;
    i = i + 1; // 0x0038
    

    i是一个指针,指向内存地址0x0034, 不要误认为i + 1等于0x0035,正确答案是0x0038(也就是sizeof(int)的大小 )。

    原因是i + 1表示指针向内存地址的高位移动一个单位,而一个单位的short类型占据两个字节的宽度,所以相当于向高位移动两个字节。

    同样的,i - 1得到的结果是0x0032。指针移动的单位,与指针指向的数据类型有关。数据类型占据多少个字节,每单位就移动多少个字节。

  2. 指针与指针的加法运算

    两个指针进行加法是非法的。

  3. 指针与指针的减法
    相同类型的指针允许进行减法运算,返回它们之间的距离,即相隔多少个数据单位。
    高位地址减去低位地址,返回的是正值;低位地址减去高位地址,返回的是负值。
    这时,减法返回的值属于ptrdiff_t类型,这是一个带符号的整数类型别名,具体类型根据系统不同而不同。这个类型的原型定义在头文件stddef.h里面。

    int* i1;
    int* i2;
    
    i1 = (int *)0x0034;
    i2 = (int *)0x0038; // i2 与 i1之间相差4个字节,就是一个int的距离
    
    ptrdiff_t dist = i2 - i1;
    printf("%td\n", dist);  // 1
    
  4. 指针与指针的比较运算
    指针之间的比较运算,比较的是各自的内存地址哪一个更大,返回值是整数1(true)或0(false)。

三、多级指针

这里的 03 号格子就叫二级指针,05 号格子就叫指针,而 07 号就是我们平常用的变量。

不管几级指针有两个最核心的东西:

  • 指针本身也是一个变量,需要内存去存储,指针也有自己的地址
  • 指针内存存储的是它所指向变量的地址

这就是我为什么多级指针是逻辑上的概念,实际上一块内存要么放实际内容,要么放其它变量地址,就这么简单。

怎么去解读int **a这种表达呢?

int **a 可以把它分为两部分看,即int**a,后面 *a 中的*表示 a 是一个指针变量,前面的 int* 表示指针变量a

只能存放 int* 型变量的地址。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

金和OA JC6 ntko-upload 任意文件上传漏洞

产品介绍 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 漏洞概述 金和 OA JC6 ntko-upload接口处存在任意文件上传漏洞,攻击者可以通过构造特殊请求包上…

使用Go语言的HTTP客户端库进行API调用

随着微服务架构和RESTful API的普及,API调用成为了日常开发中的常见任务。Go语言提供了多种工具和库来帮助开发者轻松地与API进行交互。本文将介绍如何使用Go语言的HTTP客户端库进行API调用。 在Go语言中,标准库中的net/http包提供了基本的HTTP客户端功…

【物联网】手把手完整实现STM32+ESP8266+MQTT+阿里云+APP应用——第3节-云产品流转配置

🌟博主领域:嵌入式领域&人工智能&软件开发 本节目标:本节目标是进行云产品流转配置为后面实际的手机APP的接入做铺垫。云产品流转配置的目的是为了后面能够让后面实际做出来的手机APP可以控制STM32/MCU,STM32/MCU可以将数…

光明源@智慧厕所技术:优化生活,提升卫生舒适度

在当今数字科技飞速发展的时代,我们的日常生活正在经历一场革命,而这场革命的其中一个前沿领域就是智慧厕所技术。这项技术不仅仅是对传统卫生间的一次升级,更是对我们生活品质的全方位提升。从智能感应到数据分析,从环保设计到舒…

vmware中ubuntu虚拟机不能够用共享文件夹

有时候发现装好虚拟机后,然后 虚拟机-设置-选项-共享文件夹 然后使用快捷键ctrlaltt 打开命令行,cd /mnt下没有看到hgfs文件夹 解决办法是安装vmware tools工具 此时想通过点击 虚拟机-安装vmwaretools工具 按钮 居然发现该按钮是灰色的&#xff0…

Spring中的数据校验

文章目录 引言摘要正文基于 ValidationUtils的简单校验基于自定义 Validator的校验Spring内置校验 LocalValidatorFactoryBeanHibernateValidator校验使用HibernateValidator自定义校验规则 总结 引言 我们在日常的软件开发过程中,尤其是WEB开发过程中,…

vr眼镜和AR眼镜的区别有哪些?哪些产品可以支持VR应用?

vr眼镜怎么连接手机 要将VR眼镜连接到手机上,您可以按照以下步骤进行: 1. 确保您的手机支持VR应用程序:首先,确保您的手机具备运行VR应用程序的硬件和软件条件。一些VR应用程序可能对设备有特定的要求,如处理器性能、操…

Dart调用JS对10000条定位数据滤波

使用Dart调用JS,还是为了练习跨语言调用; 一、编写对应的JS代码 平时在开发时不推荐将算法放在JS里,我这里是简单的做一下数据过滤; 首先生成一些随机定位数据,在实际开发中可以使用真实数据; // 随机定…

【DevOps-06】Jenkins实现CI/CD操作

一、简要说明 基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现持续集成 基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD实现持续部署 二、准备Springboot工程 1、IDEA新建工程 2、填写项目工程信息 3、选择Springboot版本…

从查询到高质量回答:发挥 RAG 和 Rerankers 的潜力

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号 原文标题:From Queries to Quality Answers: Harnessing the Potentials of RAG and Rerankers 原文地址&…

微信小程序如何搜索iBeacon设备

1.首先在utils文件夹下创建bluetooth.js和ibeacon.js 2.在 bluetooth.js文件中写入 module.exports {initBluetooth: function () {// 初始化蓝牙模块wx.openBluetoothAdapter({success: function (res) {console.log(蓝牙模块初始化成功);},fail: function (res) {console.l…

citeSpace保姆级安装使用教程

citeSpace保姆级安装使用教程 文章目录 citeSpace保姆级安装使用教程CiteSpace功能与参数区安装使用知网数据导出citespace数据导入结果 设置操作隐藏节点 CiteSpace功能与参数区 安装 citeSpace安装教程 citespace下载 网址:https://citespace.podia.com/ 安装之…

Nginx 的 gzip 压缩

目录 1. 为什么要开启gzip 压缩 2.对网站配置文件进行修改 1. 为什么要开启gzip 压缩 nginx使用gzip压缩主要是为了降低网站的带宽消耗和提升访问速度。通过对页面进行压缩,可以减少传输的数据量,从而减少网络传输的时间和带宽消耗。 当浏览器接收到压…

视频剪辑指南:如何将多个视频快速批量合并的方法

在日常生活和工作中,经常要将多个视频片段合并为一个完整的视频。但是手动剪辑每个视频不仅费时,而且效率低下。那么如何解决这个问题呢,可以采用一些快速批量合并视频的方法。现在一起来看看云炫AI智剪如何批量合并视频的具体步骤吧。 合并…

天津大数据培训机构 大数据时代已到来!

大数据时代已经来临,越来越多的人开始关注大数据,并且准备转行大数据。但是,对于一个外行人或者小白来说,大数据是什么?大数据需要学什么?什么样的大数据培训机构是靠谱的?这几个简单的问题就足…

数据库 补充 树,红黑树,b树,b+树

01.树 02.二叉树和二叉平衡树 03.平衡二叉树的恢复 将导致不平衡的结点称作被破坏者,破坏了结点的平衡的结点成为破坏者,经过调整可以让该树平衡的结点称为调整结点。 LL型: 以被破坏者的左孩子结点作为调整结点,对其进行右旋…

【书生·浦语大模型实战营01】《书生·浦语大模型全链路开源体系》

《书生浦语大模型全链路开源体系》 1. 大模型成为热门关键词 LLM发展时间轴 2. 书生浦语全链条开源开放体系 微调:XTuner 支持全参数微调支持LoRA等低成本微调 评测:OpenCompass 全方位评测,性能可复现80套评测集, 40万道题目…

网工内推 | 保险业网工,有绩效奖金,CISP认证优先,最高16K

01 华贵人寿保险股份有限公司 招聘岗位:系统管理岗(主机管理方向) 职责描述: 1.负责数据中心私有云平台的规划建设以及后期的运行维护; 2.负责公司操作系统的规划、部署与日常维护; 3.负责操作系统运维相关…

idea设置注释在鼠标当前位置,使其不从顶格位置添加注释

idea设置注释在鼠标当前位置,使其不从顶格位置添加注释 默认情况下,注释都是从改行的顶格开始,看起来不太美观而且不易清除分级 设置让其从代码处开始,步骤:File–>Sttings–>Editor–>Code Style &#xff…

在 IDEA 中创建JavaWeb 项目的方式(超详细步骤教程和遇到的问题)

目录 0-1项目图片操作步骤链接0-2项目结构预览1.新建Project2.定义项目名称3.创建完成后项目结构4.创建config文件夹4.1 作用 5.在WEB-INF下创建lib文件夹5.1然后搞几个常用的jar包放入5.1.1jar包全选中后右键选择放入类库5.1.2jar包全选中后右键选择放入类库 6.创建src下文件夹…