数组名的意义

news2025/1/17 0:57:26

数组名只有单独放在sizeof内部以及放在&后才代表整个数组的地址。其余情况数组名都表示数组首元素地址。

之前我们说过用sizeof(a)计算的是整个数组的大小,现在我们知道其中的原因了。由于sizeof里的数组名a表示整个数组的地址,故sizeof(a)求的是整个数组的大小。

以一维数组为例:

我们常利用这条性质来求数组中的元素个数

int a[] = {1,2,3,4,5,6,7,8};
sizeof(a);//sizeof给出整个数组所占据的内存的大小,单位是字节
sizeof(a[0]);//给出数组中单个元素的大小
sizeof(a)/sizeof(a[0])//得到数组一共有多少个元素

这样的代码一旦修改数组中初始的数据,不需要修改遍历的代码。

以二维数组为例:

int arr[3][4] = {0};
sizeof(arr)//这表示整个二维数组的大小

当然对于“数组名只有单独放在sizeof内部以及放在&后才代表整个数组的地址”这个结论有一个特殊情况。

当数组作为函数参数时,传参传过去的数组名是数组首元素的地址,这个时候在函数内部使用sizeof(arr),其中的arr表示的就是首元素的地址,而不是整个数组的地址,因此我们在函数内部不可使用sizeof来计算整个数组的大小,也就不能用上述方法来计算数组的元素个数。

int search(int a[],int key){
	......
}

int main()
{
	int a[] = {1,2,3,4);
	search(a,key);
)

如上述代码,在main函数中调用search函数把a,也就是数组首元素地址传给了search函数,也就是说search函数接收到的a是数组首元素的地址,因此search函数里面的数组名a表示数组首元素地址,因此在search函数内部不可以用sizeof(a)来计算整个数组的大小。

那如果我们在search函数内部用sizeof(a)来计算整个数组的大小会怎么样呢?

如图所示,在main函数中调用search函数,将arr,也就是数组的首元素地址传给search函数,因此在search函数内部,arr表示数组的首元素地址,故sizeof(arr)实际上就是sizeof(int *),为4字节,故最终输出结果为1。

因此数组作为函数参数时,我们不能用上述方法在函数内部求数组的大小,所以我们通常单独使用一个参数来接收数组的大小:

int search(int a[],int key,int len){
	......
}

int main()
{
	int a[] = {1,2,3,4};
	int len = sizeof(a)/sizeof(a[0]);
	search(a,key,len);
)

如上述代码,因为是在运算符sizeof里面使用,故这里的数组名a表示整个数组的地址,在调用search函数时,将其传给search函数时它又表示数组首元素的地址了。

搞懂这个特殊情况后,我们再思考一个问题,为什么数组作为函数参数时,我们传的是数组首元素的地址呢?

这是因为有些数组是一片很大的空间,比如存储了1000个int类型元素的数组,它的大小是4000字节,如果我们传参的时候把整个数组传过去,那么在函数内部就要重新开辟4000字节大小的空间来接收传过来的值,这无疑会造成空间的浪费,而数组元素在内存中是连续存储的,传大小很小的首元素的地址就能找到其他元素,相当于是传了整个数组,因此没有必要传整个数组,传首元素地址就可以了。

学到这,我们已经了解数组名的意义了,数组名既可以表示数组首元素的地址,也可以表示数组的地址。

数组首元素地址和数组地址有什么联系和区别吗?

联系:

两个在数值上是一样的

区别:

当数组名arr表示数组地址时,arr+1直接跳过一个数组的大小

如图所示,首先输出数组arr的地址,然后输出arr+1,二者之间刚好相差0x28,也就是相差十进制的40字节,即相差一个数组的大小,说明arr+1跳过一个数组的大小。

当数组名arr表示首元素的地址时,arr+1表示下一个元素的地址,即第二个元素的地址

如图所示输出arr+1的结果和输出&arr[1] (第二个元素的地址)是相同的,因此arr+1就表示第二个元素的地址。

故arr表示首元素(arr[0)])地址,那么arr+1就表示第2个元素(arr[1])的地址,以此类推,arr+2表示第3个元素(arr[2])的地址,arr+i表示arr[i]的地址。

我们刚刚提到过,除了那两种情况,数组名都表示数组首元素地址,对于一维数组而言,数组首元素就是第一个元素。

那么对于二维数组而言,数组首元素是什么呢?

二维数组的首元素就是第1行数组,所以二维数组的首元素地址就是第1行数组的地址。

 

我们可以用数组指针来保存二维数组首元素的地址:

arr[3][4] = {0);
int(*p)[4] = arr

此时arr保存的是二维数组首元素的地址,即第1行数组的地址,可以把arr看作是int[4]类型的数组指针,所以arr+1相当于跳过一个int[4],也就是arr+1直接跳过第1行数组,指向第2行数组,是第2行数组的地址。

那么arr+i就是指向第i+1行数组,相当于第i+1行的数组地址,*(arr+i) 相当于第i+1行的数组,第i+1行数组可以看作第i+1行的数组名,通常情况下数组名表示数组首元素的地址,所以 *(arr+i)也是第i+1行数组首元素的地址。

为了加深对上述概念的理解,我们可以看看下面这段代码:

int arr[3][4] = {0};
sizeof(arr[0]);

这里的sizeof(a[0])计算的是什么呢?

arr[0]表示数组首元素,对于二维数组而言,首元素就是第1行数组,故这里的arr[0]表示第1行数组,第1行数组又可以看作第1行数组的数组名,此时属于数组名单独放在sizeof里面的情况,故sizeof(arr[0])表示第1行数组的大小,那么最终的值就是16。

我们再看看下面这段代码:

int arr[3][4] = {0};
sizeof(arr[0]+1);

arr[0]表示第1行数组,也就是第1行的数组名,但是由于他不是单独放在sizeof内部,也不是放在&后面,故它表示的就是第1行数组首元素的地址,故arr[0]+1表示第1行数组第2个元素的地址,故sizeof(arr[0]+1)算出的结果是4/8。

我们最后再来看一段代码:

int arr[3][4] = {0};
sizeof(*(arr+1));

arr表示二维数组首元素的地址,即第1行数组的地址,那么arr+1就是第2行数组的地址,*(arr+1)表示第2行数组,第2行数组又可以看作第2行数组名,而此时它又是单独放在sizeof内部的,故sizeof( *(a+1))就表示第2行数组的大小,结果为16。

 

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

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

相关文章

Android10以上系统Audio音频遇到播放无声时的分析方法

​商务合作 2023年招聘 2023年逆向分析资料汇总 推荐阅读 Android Audio音频系统 Android Audio音频系统之深入浅出 Android Framework/驱动/内核中高级工程师 ​Android10以上系统Audio音频遇到播放视频无声时的分析方法 干货|Android APP应用工程师转Framework工程师(…

51单片机存储结构

之前概要介绍了8151微控制器的结构(也就是51单片机)。相比微处理器,微控制器的区别之一是在一个芯片上有程序存储器(RAM)和数据存储器(RAM)。存储区是微控制器非常重要的内容。 本文就介绍一下8051的存储结构。包括存储器的组织、处理器对存储…

VTK-Tessellator Subdivision

前言:本博文主要研究Tessellator 的Subdivision,对vtk中的所有相关接口进行研究,并找出最优的解决方法。 GeometricObjects中vtkTessellatorFilter的应用实例 待研究对当前的Subdivision进行优化。 vtkTessellatorFilter 位置:…

Docker容器数据卷与数据卷容器

文章目录什么是容器数据卷使用数据卷使用 docker 安装 mysql匿名和具名挂载数据卷容器什么是容器数据卷 Docker理念回顾 将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对于数据的要求,是希望能够 持久化的! 就…

【寒假每日一题】DAY.6 有序序列的合并

牛客网例题:点我做题 描述 输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。数据范围: 1 ≤ n,m ≤ 1000,序列中的值满足0≤val≤30000输入描述: 输入包含三行,第一行包含两个正整…

微信小程序开发起步

一、小程序与普通网页开发的区别 1)运行环境不同。网页运行在浏览器环境中,小程序运行在微信环境中。 2)API不同。由于运行环境不同,所以小程序中无法调用DOM和BOM的API,但是小程序可以调用微信环境提供的各种API&am…

zabbix的安装部署,一看就会

目录 1、系统组成 2、采集模式 3、监控类型 4、相关术语 5、安装部署 1、系统组成 2、采集模式 监控系统数据采集的工作模式可以分为 被动模式(从服务器端到客户端采集数据,对应的英文单词是pull) 主动模式 (客户端主动上报…

java基于springboot的新生报到系统app新生报到安卓app新生入学报到小程序加论文

简介 本项目主要是新生报到系统,包含的新生入学流程的功能:新生可以在app里提交预报到日期确认报到,查看自己的学费缴费记录,更改自己的银行卡号,查看课表,查看寝室,查看自己的专业班级等个人信…

CubeMX配置:定时器中断及串口配置

本文通过CubeMX配置F103RCT6的定时器中断和串口。 文章目录1 引入2 配置过程2.1 配置时钟过程2.2 配置串口过程2.3 定时器中断配置3 生成工程代码4 测试串口及定时器中断周期5 总结1 引入 拿到一个STM32控制器,在啥也没有的情况下从零开始写软件,博主习…

Java K 个一组翻转链表

K 个一组翻转链表困难给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的…

电视为何降价至200元依然没人买?爱奇艺给出了答案

近日爱奇艺提高降低会员的服务内容,消费者要享受到将内容投放到电视就要买更贵的会员服务,引发热议,此举或许能解释国内消费者为何如今不买电视了。2022年电视行业可谓是一个相当惨淡的行业,量价齐跌,随着2022年底的到…

计算机视觉OpenCv学习系列:第二部分、图像操作

第二部分、图像操作第一节、图像读取与显示1.图像理解2.图像读取与显示3.代码练习与测试第二节、图像色彩空间转换1.图像色彩空间2.函数说明与解释3.代码练习与测试第三节、图像对象的创建与赋值1.图像对象属性2.图像对象创建与赋值3.代码练习与测试第四节、图像像素的读写操作…

SpringBoot——关于controller参数校验

参数校验主要使用两个标签Validated和Valid; Valid是Hibernate的注解校验,Validated是spring的,是Valid的增强;这两个标签也有一些不同之处,Valid可以标注在成员属性上也可以嵌套校验,而Validated不行&…

Node.js 操作MySQL数据库

在讲Node.js中引入mysql模块之前先讲一下关于MySQL数据库,首先是关于MySQL数据库的安装和mysql服务以及对mysql命令和可视化工具的一个基本使用;那么在这里已经准备好了关于MySQL数据库的内容了: MySQL 数据库安装详细 : MySQL数…

redis主从复制,一主多仆启动流程

文章目录一、安装redis二、复制修改配置文件三、添加conf配置文件四、开启主从复制五、薪火相传六、反客为主7、哨兵模式一、安装redis redis安装笔记 https://blog.csdn.net/G_GUi/article/details/128361131 二、复制修改配置文件 把redis.conf复制到一个新建文件夹里面&a…

安卓手机还有这么多神仙玩法,关键只有少数人知道

随着“智能手机”的快速更新迭代,手机系统逐渐融入了许多实用功能;今年Android手机市场竞争相当激烈,各大手机品牌都争先恐后地向消费者展示自己的新机型。今天我就来给大家分享几个只有安卓手机才有的隐藏黑科技功能,每个功能都非…

cocos creator新手教程:第003节3D模型的基本概念

3.1 计算机如何制作一个3D模型 讲述这个问题之前,我们先来看下现实生活中我们要做一个模型,应该如何做呢?首先我们要把模型的形状给雕刻构建出来,现实生活中的物体都是由分子组成的连续的表面,计算机是离散的无法做到这…

【jQuery】常用API——尺寸、位置操作

一、jQuery 尺寸 以上参数为空&#xff0c;则是获取相应值&#xff0c;返回的是数字型。如果参数为数字&#xff0c;则是修改相应值。参数可以不必写单位。 <style>div {width: 200px;height: 200px;background-color: pink;padding: 10px;border: 15px solid red;margin…

在Windows中安装Mysql数据库(shawn安装成功记录)

一、下载安装包 首先去官网下载mysql安装包 下载网址:https://dev.mysql.com/downloads/mysql/ 下载Windows系统版本,如下图 注意版本必须是8.xx, 5开头的版本不适合本教程   点击下载,选择自己的文件路径,C盘非C盘都可以(我没有放C盘),路径中不要出现中文…

【蓝桥杯简单篇】Python组刷题日寄Part08

刷题日记&#xff1f;刷题日寄&#xff01; 萌新备战蓝桥杯python组 &#x1f339; 发现有需要纠正的地方&#xff0c;烦请指正&#xff01; &#x1f680; 欢迎小伙伴们的三连关注&#xff01; 往期系列&#xff1a; 【蓝桥杯简单篇】Python组刷题日寄Part01 【蓝桥杯简单篇】…