指针进阶(1)

news2025/1/13 10:22:14

( )> [ ] > -> ++ > -- > . > *   (优先级比较)

tips

1. (全是笔者个人自己总结,仅供参考,随意取用)

 2.  

3. 地址唯一标识一块内存空间

4. printf%s打印字符串的话只要给一个起始地址就OK了,然后它就会沿着这个地址不断往下走,直到碰到\0停止。要打印字符串的话,最简单不过了,只要给个起始地址就行了。

5. 数组名就是首元素的地址,地址/指针/内存编号三个概念完全等价

6. 数组名就是首元素的地址,这个无论怎么强调都不过分 

7. const也可以去修饰数组,反正道理都是一样的

8. %p打印地址

9. 两个十六进制数相减的结果别傻乎乎的认为是十进制的数,也是十六进制的。

10. 对于整型数组没有办法一次性打印所有数据,必须通过循环的方法,因为没有结束的标志

字符指针

1. 对字符char变量取地址把它放进指针变量时,这就是一个字符指针变量。它指向的内容是字符,这个是我们之前就已经知道的字符指针。

2. 上面是一种写法:让字符指针指向字符变量。但是还有一种使用方式:char* p = "hello"。当常量字符串出现在代码里面的时候,它就代表着字符串第一个字符的地址。 

3. 字符串本身与数组是非常相似的。因为字符串常量本来也就是在内存里面连续存放,那么这样的话就与数组没有区别了,把它理解成数组没有任何问题,只是不能修改。

4. 常量字符串无法被修改,因此如果char* p = "hello"这样子就会非常危险,*p是不被允许的,于是用const修饰,const char* p = "hello"

5.  因为常量字符串是无法被修改的,也根本是无法被改动的,既然这样的话,有必要存两份吗?没必要,反正都一模一样,你也不能被改,我也不能被改。因此,如果相同字符串常量被用多份,出现了许多次,事实上在内存面不会存很多份,只需要存一份就可以了

6. 内存除了之前讲过的栈区堆区静态区,其实还有其他的区,比如说只读数据\常量区等等都还是有的,我们学语言先关注几个比较常用的大区:栈区堆区静态区,后期其他的会慢慢渗透,字符串常量实际上是放在内存里面的只读数据区的,但现在也许不用管那么多,反正就是说在内存里面,那么肯定是有它的内存地址。

指针数组(存放指针/地址的数组)

如: 

根据优先级关系,变量名先与[ ]结合,就表示是一个数组;先与*结合,就表示是一个指针变量。

1. 有整型数组存放整型,字符数组存放字符,那指针数组顾名思义就是存放指针的数组,也可以理解成是存放地址的数组,比如说char* arr[10]。再次强调一下:指针=地址=内存编号。等价着来看

2. 指针数组可以把原先在内存当中物理上不连续存放的东西它们的某些地址某种程度上又连续了

可以把指针数组想象成美国海军一样,里面有着一艘一艘的航母(指针/地址),一旦需要,可以直接到内存的某个空间去访问/执行操作 

数组指针(存放数组地址/指向数组的指针)

根据优先级关系,变量名先与[ ]结合,就表示是一个数组;先与*结合,就表示是一个指针变量。

1. 指针数组是存放指针的数组。那什么是数组指针呢?那我们就回忆一下之前学的:字符指针~存放字符变量地址的指针~指向字符的指针~char*;整型指针~存放整型变量地址的指针~指向整型的指针~int*;浮点型指针,也有float*与double*,也是指向浮点型的指针。
那么好了,类比一下就知道了:数组指针就是存放数组地址的指针~指向数组的指针。 

2.  那我到底该怎么写呢?int* pa[10] = &arr?发现这样明显是不对的,左边这不就是指针数组了吗?这时候发现pa不能与屁股后面的[10]结合在一起,因为如果结合在一起的话,那么就是一个数组了,而我现在在讨论数组指针。为了表示它是一个指针,首先与*结合,这样就说明它是一个指针。int (*p)[10]=&arr,这样子就对了。首先,与*结合,这就说明p 是一个指针,那么这个指针到底指向哪边的?向外一看,指向[10]这样一个东西,指向数组,10个int元素的数组。

指针数组与数组指针

1       根据优先级,变量名先与[ ]结合就表示是一个数组;先与*结合就表示是一个指针变量。 

         数组的类型是如:int [10],char [18]...... (就是构造类型)           

2       数组名的类型(就是指针变量的类型)

         &arr的类型

数组指针的使用 

1. 那么当我对数组指针解引用操作(利用其指向的内存地址以及其后的势力范围找到内存条里面的数据)的时候,你知道的势力范围老大嘞,一下子就找到了整个数组的数据,一揽子打尽。当然,对于这个数组我也可以在其里面再去访问每一个元素,如:(*p)[ i ]。但是是个正常人都知道,这样很别扭,不如用首元素的地址➕偏移量。 那这个数组指针是不是很鸡肋啊,也不见得。这个数组指针本来就对一维数组很不友好,对于一维数组来说,很少用这玩意儿,一般在二维数组用

2.  二维数组而言,其第一个元素(首元素)就是第一行,第二行就是第二个元素......在二维数组里面,一行是一个元素,一行是一个元素。因此:二维数组是一维数组的数组,把一维数组当成一个元素,相当于是存放一维数组的一维数组。

因此:二维数组数组名 -> 首元素的地址 -> 其首元素就是第一行整个数组 -> 二维数组数组名就是数组指针

利用数组指针打印二维数组: 

 

在创建数组那个代码里面,有三个需要说明的东西:元素个数,元素类型,数组名称。因此把数组名和元素个数拿走不看,剩下的就说明是数组每个元素的类型了。如int arr[10];拿走arr[10]剩下int,这个int就代表数组的元素类型。那道理也是一样,如int (*parr3[10])[5],当我把数组的名字与数组的元素个数拿走的时候,剩下的就是数组每个元素的数据类型,那我把parr3与[10]拿走,就剩下int (*)[5],这个就是数组每个元素的类型,因此我发现这个数组是数组指针数组。

3. 数组指针解引用得到的就是整个数组,可以下标访问 

一维数组传参

二维数组传参

一级指针传参

二级指针传参 

传参其实就是在形参与实参中间划条等号

      

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

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

相关文章

【 Vue3 + Vite + setup语法糖 + Pinia + VueRouter + Element Plus 第二篇】(持续更新中)

在第一篇中我们讲述了Vue3框架的搭建以及Vue3的常用语法,这篇文章将使用 Axios 和 Element Plus 并使用封装组件的方式完成表格搭建。 本期需要掌握的知识如下: 引入并封装 Axios 请求配置 .env 文件通过 api 接口获取数据 下期需要掌握的知识如下: 组件的封装和…

MySQL主从延迟的解决方案

1、MySQL主从延迟的解决方案 之前项目中基于 MySQL 主从复制以及 AOP 的方式实现了读写分离,也写了博客记录了这个实现过程。既然配置了 MySQL 主从复制,那么自然会存在主从延迟,如何尽可能减小主从延迟对应用系统的影响是很有必要的思考点&a…

特征工程原理(一)

一、定义 在机器学习原理中讲过机器学习的基本流程,其中很重要的一个环节就是特征工程。 1.1 基本概念 特征工程(Feature Engineering):从原始数据中提取特征的过程,这些特征可以很好地描述数据,并且利用…

Showdoc升级版本记录

目录 Showdoc介绍 升级步骤 1.备份当前版本 2.下载安装最新版本 总结步骤: Showdoc介绍 ShowDoc是一个非常适合IT团队的在线API文档、技术文档工具。通过showdoc,你可以方便地使用markdown语法来书写出美观的API文档、数据字典文档、技术文档、在线…

GitHub创建仓库,使用SSH建立连接(github创建仓库,github使用SSH建立连接)

GitHub简介:GitHub是一个面向开源及私有软件项目的托管平台,也是一个开源代码库以及版本控制系统,Github拥有超过900万开发者用户,已经成为了管理软件开发以及发现已有代码的首选方法。 怎样创建仓库并使用?详细操作步…

FTP错误代码

本文迁移自本人网易博客,写于2015年4月15日,FTP错误代码 - lysygyy的日志 - 网易博客 (163.com)1、12003错误指定用户未添加到有权限的组中;即指定用户没有权限。2、CFtpFileFind.FindFile GetLastError 12110 (1)当递…

对比学习综述

一 . 发展历程大概可以分为四个阶段 1、百花齐放:在这个阶段中,方法、模型、目标函数、代理任务都还没有统一,所以说是一个百花齐放的时代。 InstDisc(instance discrimination)CPCCMC 2、CV双雄:这个阶…

十六、xml、单元测试、注解、单例模式

xml 1.概述【理解】 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年,又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者: Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域最具权威和影响力的国际中立性技术标准机构。 到目前为止&…

新提案,初识CSS的object-view-box属性

在开发时,一直希望有一种原生的css方式来裁剪图片,并将其定位在我需要的任何方向。这可以通过使用一个额外的html元素和不同的CSS属性来实现,后面解释。在这篇文章中,将带领大家了解Jake Archibald在今年年初提出的新的CSS属性obj…

VisionBank AI实现4项技术突破----传统算法融合深度学习,重新定义“工业视觉检测大脑”

机器视觉经过长时间的发展,技术不断取得重大突破并被广泛应用,当前已遍布工业生产的各个环节。而且机器视觉易于实现自动化集成,软件集成,是实现智能制造的基础技术。据统计,中国的机器视觉市场需求近几年处于持续高速…

【目标检测】ROI Pool和ROI Align的区别

这里说一下ROI Pool和ROI Align的区别: 一、ROI Pool层 参考Faster RCNN中的ROI Pool层,功能是将不同size的ROI区域映射到固定大小的feature map上。 它的缺点:由于两次量化带来的误差; 将候选框边界量化为整数点坐标值将量化…

【Vue】后台管理系统

O 项目说明 1.脚手架 vitevue-cli 》 webpack 2.vite脚手架使用 官网:https://vitejs.cn/ Vue3 vite官网:https://cn.vitejs.dev/ Vite下一代的前端工具链,为开发者提供急速响应 # 安装 $ cnpm i vite -g $ vite -v vite/4.0.3 darwin…

Sentinel + Redis + Mysql + RabbitMQ 秒杀功能设计及后端代码实现

文章目录前言数据一致性高性能动静分离静态资源缓存流控缓存数据库消息队列RabbitMQ的优点高并发分布式锁后端代码实现中间件表结构添加依赖公共常量实体类Redission配置定时任务Controller下单接口付款接口接收通道消息完整代码前言 在开发秒杀系统功能的时候,需要…

MyBatis讲解,批量添加

一、批量添加 1.书写BookMapper 1.1先在navicat的新建查询里书写条件查询的sql语句 条件查询的sql语句 insert into book(book_name) values(三体); 1.2将sql语句复制到BookMapper里 用到foreach标签; collection:可以放数组,也可以放list集…

数据结构与算法-算法分析(2)

算法和算法分析 对于同一个问题可能由不同的算法。究竟来如何评价这些算法 一个算法首先要具备正确性,健壮性,可读性和有穷性,然后我们再比较其算法的效率,来评判算法的优劣。 主要从时间和空间上的效率进行评价算法&#xff0c…

对JSON的理解

什么是JSON? JSON全名是JavaSpript Object Notation。 JSON是轻量级的文本数据交换格式。 JSON是存储和交换文本信息的语法,类似XML,比XML更小,更快,更易解析。 JSON可以将Java对象转换为特殊格式的字符串(JSON串&#xff09…

矿井水深度除总氮

工艺原理 选择性去除硝酸盐氮 项目背景 近年来高矿化度和含特殊组分矿井水逐年增多,以及环保政策的趋严给矿井水处理带来新挑战。 随着《水污染防治行动计划》 (水十 条)的深入开展和新的煤矿环境影响评价制度的执行,山西、陕…

CSS权威指南(三)特指度

文章目录1.特指度的定义2.继承3.层叠1.特指度的定义 ​ 我们都知道,当同一元素被设置了两个相同属性的时候,只会生效其中的一个属性值。至于到底生效哪一个属性值,自然是有一套计算规则的。在CSS中,选择符的特指度由选择符本身的…

模板学堂丨数据大屏配色设计指南

DataEase开源数据可视化分析平台于2022年6月正式发布模板市场(https://dataease.io/templates/)。模板市场旨在为DataEase用户提供专业、美观、拿来即用的仪表板模板,方便用户根据自身的业务需求和使用场景选择对应的仪表板模板,并…

[MySQL]-双主+keepalived实现高可用

[MySQL]-双主keepalived实现高可用 梁森 | 2023年1月 本文旨在记录学习主从时的拓展内容,怎么借助keepalived实现简单的高可用。 一、环境介绍 1.1 keepalived keepalived的作用是检测服务器的状态,若某一台服务器宕机,会通过VIP(…