C语言(指针)5

news2024/11/27 3:59:19

                Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注+收藏,欢迎欢迎~~     

                                💥个人主页:小羊在奋斗

                                💥所属专栏:C语言   

        本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为同样是初学者的学友展示一些我的学习过程及心得。文笔、排版拙劣,望见谅。

                                7、指针数组模拟二维数组

                                8、字符指针

                                9、数组指针

                                                9.1数组指针的创建

                                                9.2数组指针指针指针数组

                                10、二维数组传参的本质

7.指针数组来模拟二维数组

        用指针数组来表示二维数组是非常适合的,因为二维数组的每一行就像一个一维数组,这个一维数组也是可以通过指针来访问。 

        上面虽然我们没有定义二维数组,但我们用指针数组的方法模拟实现了二维数组。

        上面代码的执行细节是,我们首先对指针数组arr解引用找到对应下标的元素,其中元素也是地址,那我们再对这个地址解引用就能得到对应下标的元素,此时的元素就是arr1、arr2、arr3三个数组中存的整型元素。 

8、字符指针

        类似于整型指针,字符指针我们并不会感到陌生,因为用法跟整型指针很像:

        下面介绍一个不一样的用法:

        上面的两个指针变量pa和pc有什么区别呢?

        对于pa,我们先定义了一个字符数组,然后将字符串 “abcde” 存到数组中,再将数组首元素的地址存到了pa中,其中数组是可以被修改的

        那pc跟pa的区别在哪里呢?我们是将字符串 “abcde” 存到pc中吗?不是的,这个字符串 “abcde” 是一个常量字符串,而常量字符串作为一个表达式的时候,其值是首字符的地址,也就是说,我们是将首字符 ‘a’ 的地址存到了pc中。作为一个常量字符串,因为具有常属性,所以是不能被修改的。 

        来证实一下上面所说的内容:

        可以看到pc中存的确实是常量字符串 “abcde” 的首字符 ‘a’ 的地址。

        当我们尝试用字符 ‘w’ 替换字符 ‘a’ ,调试执行到这句代码的时候就报错,提示访问权限冲突,所以常量字符串确实是不能被修改的。但是在我们写下修改的这句代码后编译器并不会报错提示,只有当我们调试的时候才会报错提示,那有没有什么方法让我们写下这句代码后就提示错误的信息呢?这样我们就立马会知道我们写了错误的代码。

        提到不能被修改,还要提示报错得信息,相信你肯定已经想到了之前的文章中介绍过的const。它的作用不就是使一个值不能被修改,而且当你尝试修改的时候立马就会有错误提示信息。那我们就用const修饰指针变量pc,但是记得要放在 “ * ” 的左边。

        虽然pc内存的只是常量字符串 “abcde” 首字符 ‘a’ 的地址,但是我们想把整个字符串打印出来也是可以的。占位符用 %s,而使用 %s 打印字符串的时候,只需要提供首字符的地址就行

         了解了上面的内容,来看一个很典型的例题:

        请结合上面所讲的内容,仔细思考一下上面代码执行的结果是什么?提示一下,我们上面所说的 “常量字符串不能被修改” 这句话很关键。实在想不到也没有关系,我们先来看结果:

        可以看到,str1和str2是不一样的,而str3和str4是一样的。跟你想的结果一样吗?如果不一样,请耐心听我解释。

        我们定义了两个字符数组,并且同样用字符串 “abcde” 初始化,虽然这两个数组内存的内容是一样的,但两个数组不一样,也就是在内存中开辟的空间不一样,那str1和str2就不一样,因为数组就表示数组首元素的地址。

        还定义了两个字符指针,并同样将常量字符串 “abcde” 首字符 ‘a’ 的地址存到str3和str4中。我们说过常量字符串不能被改变,既然不能被改变那还有必要在内存中存两份或多份吗?答案是不需要的。既然内存中只存了一份常量字符串 “abcde”,那它首字符 ‘a’ 的地址就只有一个,所以str3和str4得到的地址是一样的,这里str3和str4指向的是同一个常量字符串。

        值得一说的是,str1、str2、str3、str4比较的都是地址,而不是其中存的值。C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,它们实际会指向同一块内存。 

9、数组指针

        9.1数组指针的创建

        前面说了指针数组,这里再来了解一下数组指针。不用多说数组指针肯定是指针,不过这个指针指向的是数组,也就是说这个指针内存的是数组的地址。注意是数组的地址(&arr)而不是数组首元素的地址(arr / &arr[0])。

        数组指针该如何创建呢?跟其他类型的指针一样,创建之前应该先确定数组指针的类型吧。我们知道指针的类型取决于它所指对象的类型,比如整型指针指向的是整型所以整型指针的类型为 :int *,字符指针指向的是字符所以字符指针的类型为: char *,那同样的数组指针指向的是数组所以数组指针的类型就应该为:数组类型 *。数组类型我们之前说过,去掉数组名剩下的就是数组类型。

        比如定义一个整型数组:int arr[10],那么创建一个数组指针将数组arr的地址存到数组指针中就应该是:int *arr[10],但是这不就成了指针数组了吗?所以我们还需要简单调整一下,将数组名和代表指针的 “ * ” 用括号括起来,使它们两个结合,就得到了正确的数组指针的写法:int (*arr)[10],数组指针类型就是:int (*)[10]。

        那通过数组指针怎么得到这个数组内的元素呢?

        因为pa内存着数组的地址,所以我们得通过解引用指针变量pa来找到数组,找到这个数组就相当于拿到了数组名,那我们知道数组名也是地址(其实数组名也是一个指针类型),所以再解引用就拿到了数组内的元素。 

        9.2数组指针指向指针数组 

         说到这里又有一个问题需要我们思考,数组指针是存放数组地址的指针,那指针数组也是数组啊,将指针数组的地址存到数组指针内该如何存呢?解决这个问题前我们先来剖解一下数组指针各部分分别表示什么含义。

        了解清楚了数组指针各部分分别表示的含义,再来思考上面的问题。我们需要指针pa内存数组arr的地址,而这个数组内元素的类型是指针类型,假如这个指针指向的对象类型是int,那么,数组指针内存指针数组的地址的写法就应该是下面这样:

10、二维数组传参的本质

        我们之前在扫雷游戏中已经用过多次二维数组,这里再来回忆一下二维数组的用法:

        前面的文章中说,一维数组的数组名就是数组首元素的地址,一维数组传参的本质其实传递的就是数组首元素的地址,形参可以写成数组的形式也可以写成指针的形式。那二维数组呢?其实二维数组的数组名也是表示数组首元素的地址,二维数组传参的本质其实也传递的是数组首元素的地址,形参可以写成数组的形式也可以写成指针的形式。

        那问题来了,二维数组的首元素是什么呢?还记不记得我们在之前的文章中说过一句话:二维数组可以看做一维数组的数组。也就是说我们把二维数组的一行看作了一个一维数组,这个一维数组也是有数组名的,数组名就是 “arr[0]”。既然如此那二维数组的首元素就是二维数组的第一行,也就是这个第一行是二维数组内的第一个 “一维数组”。

        上面我们打印二维数组的时候形参写的是数组的形式,那指针的形式怎么写呢?写指针的形式先要弄清楚这个指针的类型,指针的类型取决于指针指向对象的类型。二维数组传参传递的是二维数组第一行的地址,我们把一行又看作一个一维数组,所以这个指针指向的就是这个一维数组,那要存一个数组的地址,这个指针就应该是数组指针,可以理解为二维数组传参的时候降维成了数组指针。

        不管是一维数组还是二维数组传参,形参的部分可以写成指针的形式,也可以写成数组的形式,写成数组的方式更容易理解,但我们要知道本质还是指针。 

             如果觉得我的文章还不错,请点赞、收藏 + 关注支持一下,我会持续更新更好的文章。

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

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

相关文章

等保一体机能过三级等保吗?过等保无需再买安全设备如何做到?

等保一体机能过三级等保吗?过等保无需再买安全设备如何做到? 全云在线 2024-03-28 12:08 广东 尽管等保建设的标准是统一的,但由于不同行业和用户规模的差异,建设方案呈现出多样化的特点。 虽然重点行业过等保现象确实已经十分…

【35分钟掌握金融风控策略25】定额策略实战2

目录 基于收入和负债的定额策略 确定托底额度和盖帽额度 确定基础额度 基于客户风险评级确定风险系数 计算最终授信额度 确定授信有效期 基于收入和负债的定额策略 在实际生产中,客户的收入和负债数据大多无法直接获得,对于个人的收入和负债数据&…

中小型客户过等保,选择比努力重要!

国内谈网络安全,等保是绕不过去的话题。 作为国家网络安全保障的基本制度、基本策略、基本方法,等保经过十几年发展,其基本概念、相关标准已经深入人心,市面上各类成熟的等保方案让用户应接不暇,挑花了眼。 网络安全…

数据结构之排序(上)

片头 嗨,小伙伴们,大家好!我们今天来学习数据结构之排序(上),今天我们先讲一讲3个排序,分别是直接插入排序、冒泡排序以及希尔排序。 1. 排序的概念及其应用 1.1 排序的概念 排序&#xff1a…

R语言数据分析案例-股票可视化分析

一、数据整合的对象 # Loading necessary libraries library(readxl) library(dplyr)# Reading the data from Excel files data_1 <- read_excel("云南白药.xlsx") data_2 <- read_excel("冰山.xlsx")二、数据整合的代码 # Reading the data from…

Docker:docker在项目中常用的一些命令

简介   Docker 是一个开源的容器化平台&#xff0c;它允许开发者将应用程序及其依赖项打包到一个可移植的容器中&#xff0c;并发布到任何安装了 Docker 引擎的机器上。这些容器是轻量级的&#xff0c;包含了应用程序运行所需的所有东西&#xff0c;如代码、系统库、系统工具…

“数字化叙事的革命:人工智能驱动的创意工具的崛起”

近年来&#xff0c;人工智能 (AI) 改变了我们生活的许多方面&#xff0c;数字故事讲述的世界也不例外。随着人工智能驱动的创意工具的出现&#xff0c;广告商、内容创作者和专业人士现在配备了创新的解决方案来简化他们的工作流程&#xff0c;增强他们的创意输出&#xff0c;并…

08.4.grafana自定义图形并直接数据库取值

grafana自定义图形并直接数据库取值 自定义添加油表图形 选择gauge图形&#xff0c;并且配置对应设定值&#xff0c;点击应用 如图所示&#xff0c;可以看到仪表盘上的值是zabbix上取得值 配置grafana直接数据库取值 添加mysql数据源 添加后进行配置&#xff0c;我这…

二分判定+选插冒排序+归并快速堆希尔+计数排序

二分力扣题 一&#xff1a;搜索二维矩阵 74. 搜索二维矩阵 按照题意&#xff1a;直接利用二维数组转换成一维数组进行求解 方法一&#xff1a;普通等于的二分查找 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {t…

websevere服务器从零搭建到上线(三)|IO多路复用小总结和服务器的基础框架

文章目录 epollselect和poll的优缺点epoll的原理以及优势epoll 好的网络服务器设计Reactor模型图解Reactor muduo库的Multiple Reactors模型 epoll select和poll的优缺点 1、单个进程能够监视的文件描述符的数量存在最大限制&#xff0c;通常是1024&#xff0c;当然可以更改数…

STM32快速入门(定时器之输入捕获)

STM32快速入门&#xff08;定时器之输入捕获&#xff09; 前言 本节主要讲解STM32利用通用定时器&#xff0c;在输入引脚出现指定电平跳变时&#xff0c;将CNT的值锁存到CCR寄存器当中&#xff0c;从而计算PWM波形的频率、占空比、脉冲间隔、电平持续时间等。其功能的应用有&…

免费思维13招之七:空间型思维

免费思维13招之七:空间型思维 本篇给你带来的是空间型思维。 空间型思维,具体分为内部空间型思维和外部空间型思维。 什么叫内部空间型思维呢? 内部空间型就是充分利用现有空间或资源为社会提供免费服务,积累人气,增加流量,从而带动消费。 为什么你生意不好?为什么你…

ubuntu中的docker记录(5)——如何使用阿里云的镜像加速配置docker镜像加速器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、镜像加速器介绍1. 什么是docker镜像加速器&#xff1f;2. 为什么要配置镜像加速器&#xff1f; 二、配置镜像加速器1. 注册阿里云账号2. 注册镜像容器服务3…

C++ int 学习

在C语言中 & 是取地址符号&#xff1b; 在C中有 int& 这样的&#xff0c;这里的&不是取地址符号&#xff0c;而是引用符号&#xff1b; 引用是C对C的一个补充&#xff1b; 变量的引用就是变量的别名&#xff0c;讲的通俗一点就是另外一个名字&#xff1b; a的值…

代码随想录算法训练营第二十七天| LeetCode39. 组合总和、LeetCode40.组合总和II、LeetCode131.分割回文串

#LeetCode 39. Combination Sum #LeetCode 39. 视频讲解&#xff1a;带你学透回溯算法-组合总和&#xff08;对应「leetcode」力扣题目&#xff1a;39.组合总和&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 当建立树的结构的时候&#xff0c;target 可以限制树的深…

Spring Boot 调用外部接口的几种方式

Spring Boot 调用外部接口的几种方式 在微服务架构中&#xff0c;服务间的调用是不可或缺的环节。Spring Boot 为开发者提供了多种方式来实现这一任务&#xff0c;这个文章将为你详细介绍这些方式。 一、使用RestTemplate RestTemplate是 Spring Boot 早期版本中常用的 REST 客…

基于 Spring Boot 博客系统开发(八)

基于 Spring Boot 博客系统开发&#xff08;八&#xff09; 本系统是简易的个人博客系统开发&#xff0c;为了更加熟练地掌握 SprIng Boot 框架及相关技术的使用。&#x1f33f;&#x1f33f;&#x1f33f; 基于 Spring Boot 博客系统开发&#xff08;七&#xff09;&#x1f…

HCIP-Datacom-ARST自选题库_06_排障【28道题】

一、单选题 1.如果面对复杂的网络故障&#xff0c;并经过评估认为短时间内无法完成排障&#xff0c;而此时用户又急需恢复网络的可用性&#xff0c;那么正确的做法是? 告诉用户这是不可能实现的 不通知客户的情况下&#xff0c;直接搭建替代的网络环境 始终尝试排除故障&a…

【Spring】验证 @ServerEndpoint 的类成员变量线程安全

文章目录 前言猜想来源验证方法Controller 的情况ServerEndpoint 的情况 后记 前言 最近有 websocket 的需求。探索 ServerEndpoint 的类成员变量特点。 这里类比 Controller 讨论 ServerEndpoint 类成员变量是否线程安全。 猜想来源 网上的教程大多数都这么展示程序&#…

5.10.6 用于乳腺癌超声图像分类的Vision Transformer

医学超声&#xff08;US&#xff09;成像由于其易用性、低成本和安全性已成为乳腺癌成像的主要方式。卷积神经网络&#xff08;CNN&#xff09;有限的局部感受野限制了他们学习全局上下文信息的能力。利用 ViT 对使用不同增强策略的乳房 US 图像进行分类。 卷积神经网络&#…