数组的存储

数组在内存中是一组连续的内存单元,也就是说数组元素是连续存储的。数组名是数组所占内存的首地址。

一维数组是按照下标的顺序存储的,而对多维数组就复杂些,以一定的约定顺序将多维数组存储在连续的内存单元中很重要。因为要对数组赋初值、函数间的数组数据传递等都需要先知道数组元素和存储位置的对应关系。

一维数组的元素是按照下标从小到大的顺序存在内存中的,例如,int a[3]在内存中的存储顺序是:a[0] a[1] a[2]。

对于二维数组元素,第一个下标叫做行标,第二个下标叫做列标。例如,数组int a[2][3]相当于一个两行三列的矩阵:

a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]

上面的a[0][0],行标为0,列标也为0,表示矩阵第一行第一个元素,a[1][2],行标为1,列标为2,表示矩阵第二行第三个元素。二维数组在内存中是按行存储的,也就是先存第一行,再存第二行…。

每行中的元素按照列标从小到大的顺序存储。这种存储方式叫做行优先存储。上面例子中的二维数组a在内存中的存储顺序是:a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]。

对于多维数组,其存储方式与二维数组类似。可以把多维数组的下标看作一个计数器。

多维数组右边的下标为低位,左边的为高位,每一位都在各自的上界与下界之间变化。当某一位超过上界则向左进一位,该位及右边各位就恢复为下界。最右边一维的下标变化最快,最左边的变化最慢。

再提醒大家注意,下界都是0,某一维的上界是声明时该维的下标表达式值减1。

例如,数组int a[2][2][2]在内存中的存储顺序是:a[0][0][0] a[0][0][1] a[0][1][0] a[0][1][1] a[1][0][0] a[1][0][1] a[1][1][0] a[1][1][1]。

实际上我们在软件开发时三维及三维以上的数组很少用到,用的最多的是一维数组。

数组的初始化

在我们声明数组时对部分或全部元素赋值就是数组的初始化。这里分开给大家讲简单数组类型的数组和对象数组,简单数组类型数组的初始化就是给数组元素赋初值,而对象数组的每个元素都是某个类的对象,它的初始化就是调用对象的构造函数。对象数组下面单独讲。

我们可以在声明数组时就给出每个元素的初值,例如:int a[2] = { 2,3 };这条语句声明了一个有2个元素的int类型的数组,a[0]的初值是2,a[1]的初值是3。

如果我们在声明数组时每个元素都给出初始值的话,就可以不说明元素个数,例如:int a[] = { 2,3 };和上面的那个数组声明语句等价。

我们也可以只对数组的前面一部分元素赋初值,例如,int a[3] = { 1,2 };这时数组元素的个数就必须给出,经过这样声明后,a[0]为1,a[1]为2,a[3]默认为0,也就是后面没有赋初值的元素默认为0。

多维数组的初始化也满足上面讲到的规则。另外,如果我们对数组初始化时给出了全部元素的初值,则第一位的元素个数可以不用显式说明,例如:int a[2][2] = { 1,2,1,2 };等价于int a[][2] = { 1,2,1,2 };

多维数组还可以按照第一维的下标分组,用括号把每一组括起来。二维数组的话可以用大括号将每组括起来,例如:int a[2][2] = { {1,2},{1,2}};与上面的语句等价,通过将每组元素括起来我们更能直观的分开每行数据。

对象数组

当数组的元素是某个类的对象时此数组就是对象数组。声明一维对象数组的形式为:类名 数组名[下标表达式];

跟前面说过的基本数据类型的数组一样,使用对象数组也只能引用单个的数组元素,而每个数组元素都是对象,利用这个对象又可以引用它的公有成员,引用形式为:数组名[下标].成员名

对象数组在初始化时每个对象元素都会调用其构造函数。如果初始化时数组元素显式给出初始值就会调用带形参的构造函数,如果没有显式指定初始值则调用默认构造函数。

例如,A b[2] = { A(2,3) };会先调用带形参的构造函数初始化b[0],再调用默认构造函数初始化b[1]。

数组作为函数参数

函数的参数可以是数组元素也可以是数组名。数组元素作为函数参数时跟同类型的变量作函数参数效果一样。

数组名作为函数参数时,实参和形参都须是数组名,并且数组类型要一样。此时传递的是数组的首地址,也就是说形参数组的首地址跟实参是一样的,后面的元素根据其在内存中的顺序进行对应,对应的元素的内存地址相同,所以实参数组的元素个数应该等于或多于形参数组的元素个数。

如果在函数内对数组元素值改变,则主调函数中实参数组的相应元素也会改变。

给大家一个数组作为函数参数的例子:主函数中初始化一个矩阵并将每个元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。

#include <iostream>
using namespace std;
void RowSum(int A[][4], int nrow)
{int sum;for (int i = 0; i < nrow; i++){sum = 0;for(int j = 0; j < 4; j++)sum += A[i][j];cout << "Sum of row " << i << " is " << sum << endl;A[i][0]=sum;}
}
int main()
{int Table[3][4] = {{1,2,3,4},{2,3,4,5},{3,4,5,6}};for (int i = 0; i < 3; i++){for (int j = 0; j < 4; j++)cout << Table[i][j] << "   ";cout << endl;}RowSum(Table,3);for (int i = 0; i < 3; i++)cout << Table[i][0] << endl;return 0;
}

数组的存储与初始化、对象数组、数组作为函数参数相关推荐

  1. C++多维数组:存储方式、访问方式和作为函数参数

    C++中数组可以嵌套,就是多维数组. 多维数组存储与访问方式 二维数组:一维数组可对应数学中的向量,而二维数组可对应矩阵,可用一个二维数组存储矩阵. 图1  二维数组mat示意图 二维数组的横向称为行 ...

  2. 习题 9.5 建立一个对象数组,内放5个学生的数据(学号、成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生中成绩最高者,并输出其学号。

    C++程序设计(第三版) 谭浩强 习题9.5 个人设计 习题 9.5 建立一个对象数组,内放5个学生的数据(学号.成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生中成 ...

  3. java定义对象数组初始化_怎么定义对象数组 JAVA中怎么初始化对象数组?

    java类怎样定义数组对象数组 在c++编程中,怎么定义对象数组的指针? JAVA中怎么初始化对象数组? java中怎么创建对象数组?比如我创建了一个学生类Sclass Student{ } 类中怎么 ...

  4. php7 对象转数组,php中如何将对象转数组

    php中将对象转数组的方法:php中将对象转数组的方法:首先创建一个PHP示例文件:然后通过"get_object_vars ( object $obj )"函数将对象以数组的形式 ...

  5. vue将json字符串转换为数组_json字符串、json对象、数组 三者之间的转换

    var Obj = JOSN.parse("cscac"); //将JSON字符串转换成JSON对象 var "cscac" = JSON.stringify( ...

  6. 对象数组的初始化_JAVA中数组是什么?

    Java中数组是相同类型数据的有序集合.数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们.数组的三个基本特点: ...

  7. 【C语言数组】数组的创建和初始化 内存中的存储 冒泡排序 sizeof 数组名

    test 一.一维数组的创建和初始化 1.数组的创建 2.数组初始化 2.1.不完全初始化 2.2.不初始化 3.一维数组的使用 3.1.用下标打印1-10 3.2.sizeof 计算数组的元素个数 ...

  8. Java的知识点16——数组概述和特点、数组声明、初始化、数组的遍历、for-each循环、数组的拷贝

    数组的定义 数组是相同数据类型的有序集合.数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们.数组的三个基本特点 ...

  9. C++二维数组讲解、二维数组的声明和初始化

    我们知道,一维空间是一条线,数学中用一条数轴来表达:二维空间是一个平面,数学中用平面坐标系来表达.那么二维数组又是什么样的呢? 线与面 我们用一个下标来描述一维数组中的某个元素,就好像在用数描述一条线 ...

最新文章

  1. 微软私有云系列----域服务器准备
  2. openlayers2中selectcontrol用法
  3. STARTUPE2原语
  4. android代码实现手机加速功能,Android自定义View实现内存清理加速球效果
  5. android电视盒子解码很慢,电视盒子反应慢又卡原因及解决办法推荐!
  6. c# 中重载WndProc,实现重写“最小化”自定义功能的方法
  7. C#趣味程序---车牌号判断
  8. PMP读书笔记(第10章)
  9. oracle:oracle基础知识(一)
  10. 推荐一个CodeProject上的SlideForm控件
  11. 数学单位M和单位B是什么意思
  12. 太用力的人跑不远,android开发视频
  13. 用分支限界法求解01背包
  14. 数据安全的下一个风口:SASE云服务平台
  15. 傻傻分不清楚的研究设计类型
  16. java代理实现爬取代理IP
  17. 使用Mahout搭建推荐系统之入门篇-Mahout实战
  18. 消息队列应用场景异步处理_java培训
  19. 开心网,很开心!!!
  20. 堆和堆排序:为什么说堆排序没有快速排序快

热门文章

  1. 网络-UDP与TCP
  2. android node编码,android studio中的Node.js
  3. 图片转可编辑ppt_电脑如何简单快速将图片转为文字,不用下载任何软件,免费使用。...
  4. python游戏开发库_Python库之游戏开发及虚拟现实
  5. 以xml html编写的的学生管理系统,基于.NET和XML的学生中心数据库管理系统的研究与实现...
  6. 牛顿法python实现_牛顿法求极值及其Python实现
  7. Java笔记(十七) 异步任务执行服务
  8. InvocationTargetException异常
  9. eclipse plugins
  10. Python多线程报错之RuntimeError