C语言------指针(2)

前面已经向大家介绍了指针的一些基本内容,接下来,就在再我来先大家讲解一下指针的其他内容。

1. 数组名的理解

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

在学习数组的过程中,我们肯定会写过以上代码,我们知道 int 是该数组的数据类型,[10] 是该数组的大小,arr是数组名,那数组名代表这什么吗?它除了是数组的名字之外,还有其他意义吗?

接着还是用代码来探索其意义

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };printf("arr=%p", arr);printf("arr[0]=p", &arr[0]);return 0;
}

我们写出以上代码并运行,分别打印其地址,运行后我们惊奇的发现arr的地址和arr[0]的地址恰好一样,而arr[0]有恰好是首元素。由此。我们得出数组名不仅仅是数组的名字,其也是数组首元素的地址。

那是不是在所有情况下,数组名都是首元素地址吗?

答案肯定不是,有两种情况除外。

(1)sizeof(arr) ,当我们用sizeof()来计算数组的大小时,此时数组名代表的是整个数组。

我们还是用代码来直观感受一下

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int sz1 = sizeof(arr);printf("arr=%d\n", sz1);int sz2 = sizeof(arr[0]);printf("arr[0]=%d", arr[0]);return 0;
}

用sz1来存储arr的大小,用sz2存储arr[0]的大小( 数组中一个元素的大小)。

运行代码

发现sz1的值为40,恰好是整个数组的大小,说明此时数组名代表整个数组。

(2)&arr 当数组名放在取地址操作符后面时,此时数组名也代表着整个数组。

我们还是用代码直接感受

int* p1 = &arr;
int* p2 = &arr[0];
printf("&arr  =%p\n", &arr);
printf("&arr+1=%p\n", arr + 1);
printf("&arr[0]  =%p\n", &arr[0]);
printf("&srr[0]+1=%p\n", &arr[0] + 1);

分别对arr和arr[0]取地址,分别将其存于指针变量p1和p2中

运行代码发现,分别对其加1时,指针p1跳过了40个字节,而指针p2却只跳过了一个字节。

前面我们学过,指针变量的类型绝定了其加1减1,一次能跳过的大小。

所以只有当指针p1指向整个数组时,p1才可能一次跳过40个字节。所以当数组名在&操作符后面时,此时数组名也代表整个数组。

除了这两种情况外,数组名都代表数组首元素地址。

2.使用指针访问数组名

既然数组名可以代表首元素地址,那么就可以用指针变量来保存其地址。

所以当我们用数组名作为一个函数的实参时,其形参可以写成数组的形式也可以用指针变量来接收。

我们还是用代码直接感受一下

int main()
{int arr[5] = { 0 };int sz = sizeof(arr) / sizeof(arr[0]);int* p = arr;int i = 0;for (i = 0; i < sz; i++){scanf("%d ", p + i); //这里arr本身就有 & 含义了,所以不用在家 &}for (i = 0; i < sz; i++){printf("%d ", *(p + i));}return 0;
}

 

从上面代码可以看出*(p+i)和arr[i]是等价的。

其实 *(p+i)写成p[i]也是可以运行的,所以说本质上*(p+i)是等同于p[i]的。

有个小技巧,我们可以将 [ ] 看成一个解引用操作符就好理解了。

总结:数组的访问,是以首元素地址的基础上进行的偏移量进行访问的。

3.一维数组传参的本质

当我们将一个一维数组传递给一个函数的时候,本质上如何传递的呢?接下来探讨一下。

以代码为例

void test(int arr[])
{int sz2 = sizeof(arr)/sizeof(arr[0]);printf("sz2 = %d\n", sz2);
}
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};int sz1 = sizeof(arr)/sizeof(arr[0]);printf("sz1 = %d\n", sz1);test(arr);return 0;
}

 

从代码运行结果发现,sz1的值和sz2的值并不相同。这是为什么呢?

哦,原来当我们将一个数组名传过去的时候,其实是传过去了一个地址,则形参的类型就是一个指针类型,所以当我们在test()函数里面计算arr的大小时,其实并不是计算数组的大小,而是计算了一个指针的大小。正因为函数部分参数是一个指针,所以导致我们无法在函数内部计算数组的大小。

 总结:一维数组传参时,形参部分可以写成数组形式,也可以写成指针形式。

4.二级指针

既然变量都有属于自己的地址,那么指针变量也有属于它自己的地址,那要用什么来存储指针变量呢?

那便是二级指针。

这就是一个二级指针和一个一级指针的关系图

当我们对二级指针进行解引用,得到的是一级指针的地址,再对二级指针进行一次接应用,我们就可以得到一级指针里面保存的内容。

5.指针数组

紧接着我们再来将一个特别的数组---------指针数组。

通俗易懂,指针数组就是一个用来存放指针的数组。

 

6.指针数组模拟二维数组

int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 2,3,4,5,6 };int arr3[] = { 3,4,5,6,7 };int* parr[] = { arr1,arr2,arr3 };int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 5; j++){printf("%d ", parr[i][j]);}printf("\n");}return 0;
}

分析代码:

首先我们要清楚,二维数组本质上可以看成是有多个一维数组组成的,这里我们将每个数组的数组名都存储在一个指针数组中,其中arr1,arr2,arr3 分别是指针数组中的第1个,第2个,第3个元素,前面我们提到 [ ] 可以看成解引用操作符。假如我们对parr解引用一次,便得到了arr1,也就是arr1的首元素地址,在对其进行一次解引用,就进一步的到了arr1里面的内容。

简单来说,parr[1]就等于arr1,parr[1][i]就相当于arr[1][j]。后面的以此类推。

代码运行如下

以上就是我对数组名的理解。谢谢大家的观看。 

 

 

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

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

相关文章

【C语言】C语言运算符优先级详解

文章目录 &#x1f4dd;前言&#x1f309;运算符优先级简述 &#x1f320;逻辑与和逻辑或&#x1f309;赋值和逗号运算符 &#x1f320;位运算&#x1f309;条件表达式&#x1f309;位运算与算术运算结合&#x1f309;混合使用条件表达式和赋值运算符&#x1f309; 逗号运算符的…

UE5、CesiumForUnreal实现海量POI撒点显示与聚合功能

1.实现目标 POI是UE+GIS三维场景中经常需要展示的要素,在UE中常用的表示POI方法有两种。一种是Mesh,即空间的方式;另一种是Widget,即屏幕上的方式,本文这里使用的是Widget屏幕展示的形式来表示POI。 本文这里使用的POI点位数量共3.3w+,采用直接网格聚合算法,并进行性能优…

Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件

Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件 0. 引言1. 安装 Markdown Viewer 插件2. 使用 Markdown Viewer 阅读 Markdown 格式文件 0. 引言 大部分程序员都喜欢 Markdown 格式的文件&#xff0c;这时给一些没有在电脑上安装 Markdown 编辑器的同事分享资料时&…

苹果与百度合作,将在iPhone 16中使用生成式AI

3月25日&#xff0c;《科创板日报》消息&#xff0c;苹果将与百度进行技术合作&#xff0c;为今年即将发布的iPhone16、Mac系统和iOS 18提供生成式AI&#xff08;AIGC&#xff09;功能。 据悉&#xff0c;苹果曾与阿里巴巴以及另外一家国产大模型厂商进行了技术合作洽谈。最终…

[自研开源] 数据集成之分批传输 v0.7

开源地址&#xff1a;gitee | github 详细介绍&#xff1a;MyData 基于 Web API 的数据集成平台 部署文档&#xff1a;用 Docker 部署 MyData 使用手册&#xff1a;MyData 使用手册 试用体验&#xff1a;https://demo.mydata.work 交流Q群&#xff1a;430089673 介绍 本篇基于…

Hana数据库 No columns were bound prior to calling SQLFetch or SQLFetchScroll

在php调用hana数据库的一个sql时报错了&#xff0c;查表结构的sql&#xff1a; select * from sys.table_columns where table_name VBAP SQLSTATE[SL009]: <<Unknown error>>: 0 [unixODBC][Driver Manager]No columns were bound prior to calling SQLFetch …

55、Qt/事件机制相关学习20240326

一、代码实现设置闹钟&#xff0c;到时间后语音提醒用户。示意图如下&#xff1a; 代码&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), speecher(new QTextToSpeech(t…

canvas跟随鼠标画有透明度的矩形边框

提示&#xff1a;canvas跟随鼠标画有透明度的矩形边框 文章目录 前言一、跟随鼠标画有透明度的矩形边框总结 前言 一、跟随鼠标画有透明度的矩形边框 test.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

【笔记】OpenHarmony设备开发:搭建开发环境(Ubuntu 20.04,VirtualBox 7.0.14)

参考&#xff1a;搭建开发环境&#xff08;HarmonyOS Device&#xff09; Note&#xff1a;Windows系统虚拟机中Ubuntu系统安装完成后&#xff0c;根据指导完成Ubuntu20.04基础环境配置&#xff08;HarmonyOS Connect 开发工具系列课&#xff09; 系统要求 Windows系统要求&…

Python包管理工具 pip 及其常用命令和参数用法

目录 PIP 主要功能 安装包 升级包 卸载包 列出包 检查依赖 pip的配置和环境 主要用法 1&#xff1a;版本 2&#xff1a;安装 Python 库 3&#xff1a;升级库 4&#xff1a;卸载库 5&#xff1a;搜索库 6&#xff1a;查看已安装库详细信息 7&#xff1a;只下载库…

MT6762_联发科MTK6762安卓核心板规格参数

MTK6762核心板是一款集成了蓝牙、fm、wlan和gps模块的高度集成基带平台&#xff0c;为LTE/LTE-A和C2K智能手机应用程序提供支持。该安卓核心板集成了ARM Cortex-A53处理器&#xff0c;工作频率可达2.0GHz&#xff0c;并且还集成了功能强大的多标准视频编解码器。除此之外&#…

OriginBot智能机器人开源套件

详情可参见&#xff1a;OriginBot智能机器人开源套件——支持ROS2/TogetherROS&#xff0c;算力强劲&#xff0c;配套古月居定制课程 (guyuehome.com) OriginBot智能机器人开源套件 最新消息&#xff1a;OriginBot V2.1.0版本正式发布&#xff0c;新增车牌识别&#xff0c;点击…

【Java程序设计】【C00376】基于(JavaWeb)Springboot的社区帮扶对象管理系统(有论文)

【C00376】基于&#xff08;JavaWeb&#xff09;Springboot的社区帮扶对象管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&am…

jupyter notebook导出含中文的pdf(LaTex安装和Pandoc、MiKTex安装)

用jupyter notebook导出pdf时&#xff0c;因为报错信息&#xff0c;需要用到Tex nbconvert failed: xelatex not found on PATH, if you have not installed xelatex you may need to do so. Find further instructions at https://nbconvert.readthedocs.io/en/latest/install…

基于SpringBoot和Leaflet的行政区划地图掩膜效果实战

目录 前言 一、掩膜小知识 1、GIS掩膜的实现原理 2、图层掩膜流程 二、使用插件 1、leaflet-mask介绍 2、核心代码解释 三、完整实例实现 1、后台逻辑实现 2、省级行政区划查询实现 3、行政区划定位及掩膜实现 4、成果展示 总结 前言 在之前的博客提过按空间矢量…

Ansys Speos | Light Expert Group探测器组使用技巧

附件下载 联系工作人员获取附件 概述 相机挡板的设计需要在光路的不同位置同步多个照度图&#xff0c;以尽量减少杂散光。2023R2 Speos提供了一种新的探测器&#xff0c;用于高阶杂散光分析&#xff0c;可以同时对多个探测器进行光线追迹。Light Expert工具可以即时过滤3D视…

SQLite数据库成为内存中数据库(三)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite使用的临时文件&#xff08;二&#xff09; 下一篇&#xff1a;SQLite中的原子提交&#xff08;四) ​​ SQLite数据库通常存储在单个普通磁盘中文件。但是&#xff0c;在某些情况下&#xff0c;数据库可能…

业务服务:xss攻击

文章目录 前言一、使用注解预防1. 添加依赖2. 自定义注解3. 自定义校验逻辑4. 使用 二、使用过滤器1. 添加配置2. 创建配置类3. 创建过滤器4. 创建过滤器类5. 使用 前言 xss攻击时安全领域中非常常见的一种方法&#xff0c;保证我们的系统安全是非常重要的 xss攻击简单来说就…

代码随想录 图论-并查集

代码随想录 (programmercarl.com) 寻找图中是否存在路径这道题中的类可看做并查集的标准类 目录 1971.寻找图中是否存在路径 684.冗余连接 685.冗余连接II 1971.寻找图中是否存在路径 1971. 寻找图中是否存在路径 已解答 简单 相关标签 相关企业 有一个具有 n 个顶…

使用ai智能写作场景之gpt整理资料,如何ai智能写作整理资料

Ai智能写作助手&#xff1a;Ai智能整理资料小助手 Ai智能整理资料小助手可试用3天&#xff01; 通俗的解释一下怎么用ChatGPT来进行资料整理&#xff1a; 搜寻并获取指定数量的特定领域文章&#xff1a; 想像你在和我说话一样&#xff0c;告诉我你想要多少篇关于某个话题的文…