C++基础---多维数组
来源:互联网 发布:spring源码视频百度云 编辑:程序博客网 时间:2024/05/17 22:53
1. 多维数组
1.1 二维数组
- 二维数组:本质上是以数组作为数组元素的数组,即“数组的数组”。
1.2 二维数组的初始化
- 方式一:将所有的元素都放在括号内依次排开
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12} ;(这样写不直观)
把{ }中的数据依次赋给a数组各元素(按行赋值),即:
a[0][0]=1; a[0][1]=2; a[0][2]=3; a[0][3]=4;
a[1][0]=5;a[1][1]=6; a[1][2]=7; a[1][3]=8;
a[2][0]=9;a[2][1]=10;a[2][2]=11;a[2][3]=12; - 方式二:根据二维数组的下标分为x行y列,每行用括号括起来
int a[3][4]={{1,2,3,4},
{5,6,7,8,9},
{10,11,12}} ;(这样写更清晰,更容易维护)
在{ }内部再用{ }把各行分开,第一对{ }中的初值1,2,3,4是第0行的4个元素的初值。第二对{ }中的初值5,6,7,8是第1行的4个元素的初值。第三对{ }中的初值9,10,11,12是第2行的4个元素的初值。即:
a[0][0]=1; a[0][1]=2; a[0][2]=3; a[0][3]=4;
a[1][0]=5;a[1][1]=6; a[1][2]=7; a[1][3]=8;
a[2][0]=9;a[2][1]=10;a[2][2]=11;a[2][3]=12;
注:初始化的数据个数不能超过数组设置的下标界限,否则导致越界出错。 - 方式三:为部分数组元素初始化
int a[2][3]={{1,2},{4}};
<=>等价于
int a[2][3]={{1,2,0},{4,0,0}};
第一行只有2个初值,按顺序分别赋给a[0][0]和a[0][1];第二行的初值4赋给a[1][0],其它数组元素的初值为0。即:
a[0][0]=1; a[0][1]=2; a[0][2]=0;
a[1][0]=4;a[1][1]=0; a[1][2]=0; - 方式四:可以省略第一维的定义,但不能省略第二维的定义。系统根据初始化的数据个数和第2维的长度可以确定第一维的长度
int a[ ][3]={ 1, 2, 3, 4};
<=>等价于
int a[ ][3]={{1,2,3},{4}};
<=>等价于
int a[ ][3]={{1,2,3},{4,0,0}};
<=>等价于
int a[2][3]={{1,2,3},{4,0,0}};
a数组的第一维的定义被省略,初始化数据共4个,第二维的长度为3,即每行3个数,所以a数组的第一维是2。
一般,省略第一维的定义时,第一维的大小按如下规则确定:
初值个数能被第二维整除,所得的商就是第一维的大小;若不能整除,则第一维的大小为商再加1。即:
a[0][0]=1; a[0][1]=2; a[0][2]=3;
a[1][0]=4;a[1][1]=0; a[1][2]=0;
注:在{ }中给出各数组元素的初值,各初值之间用逗号分开。把{ }中的初值依次赋给各数组元素。
1.3 二维数组的元素在内存中的排放顺序
- 如:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
二维数组在内存中的分布列表:
值 1 2 3 4 5 6 7 8 9 10 11 12 数组下标 a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]注:数组元素就像排列好队的士兵,他们在内存中也都是按照编号顺序排放的。
二维数组的元素在内存中的排放顺序的程序示例:
#include <iostream>using namespace std;int main(){ int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; for (int i=0; i<3; i++) { for (int j=0; j<4; j++) { cout<<"a["<<i<<"]["<<j<<"] = "<<a[i][j]<<endl; } } system("pause"); return 0;}=>a[0][0] = 1 a[0][1] = 2 a[0][2] = 3 a[0][3] = 4 a[1][0] = 5 a[1][1] = 6 a[1][2] = 7 a[1][3] = 8 a[2][0] = 9 a[2][1] = 10 a[2][2] = 11 a[2][3] = 12
1.4 多维数组
- 二维数组:可视为以一维数组为数据元素的向量;
- 二维数组:每个元素都属于两个向量;
- 三维数组:可视为以二维数组为数据元素的向量;
- 三维数组:每个元素都属于三个向量;
- 四维数组:可视为以三维数组为数据元素的向量;
- 四维数组:每个元素都属于四个向量;
- n维数组: 可视为以(n-1)维数组为数据元素的向量;
- n维数组: 每个元素都属于n个向量;
1.5 多维数组的顺序存储方式
- 由于计算机内存是一维的,多维数组的元素应排成线性序列后存人存储器。
数组一般不做插入和删除操作,即结构中元素个数和元素间关系不变化。 - 一般采用顺序存储方法表示数组。
(1)行优先顺序:将数组元素按行向量排列,第i+1个行向量紧接在第i个行向量后面。
如:二维数组Amn的按行优先存储的线性序列为:
a00,a01,…,a0(n-1),
a10,a11,…,a1(n-1),
……,
a(m-1)0,a(m-1)1,…,a(m-1)(n-1)
注:PASCAL和C语言中,数组按行优先顺序存储。
行优先顺序推广到多维数组,可规定为先排最右的下标。
(2)列优先顺序:将数组元素按列向量排列,第i+1个列向量紧接在第i个列向量后面。C语言中没有列优先顺序。
如:二维数组Amn的按列优先存储的线性序列为:
a00,a10,…,a(m-1)0,
a01,a11,…,a(m-1)1,
……,
a0(n-1),a1(n-1),…,a(m-1)(n-1)
注:FORTRAN语言中,数组按列优先顺序存储。
列优先顺序推广到多维数组,可规定为先排最左的下标。
1.6 遍历多维数组的10种方式
方法一:下标
int a[3][4] = {1,2,3,4,5,6,7,8};for (int i = 0; i < 3; i++){ for (int j = 0; j < 4; j++) { cout << a[i][j] << endl; }}
方法二:指针
int a[3][4] = {1,2,3,4,5,6,7,8};for (int(*p)[4] = a; p != a + 3; p++){ for (int *q = *p; q != *p + 4; q++) { cout << *q << endl; }}
方法三:指针,迭代
int a[3][4] = {1,2,3,4,5,6,7,8};for (int(*p)[4] = begin(a); p != end(a); p++){ for (int* q = begin(*p); q != end(*p); q++) { cout << *q << endl; }}
方法四:范围for
int a[3][4] = {1,2,3,4,5,6,7,8};for (int (&p)[4] : a){ for (int q : p) { cout << q << endl; }}
方法五:类别名+指针
int a[3][4] = {1,2,3,4,5,6,7,8};typedef int int_array[4];for (int_array* p = a; p != a + 3; p++){ for (int* q = *p; q != *p + 4; q++) { cout << *q << endl; }}
方法六:类别名+迭代
int a[3][4] = {1,2,3,4,5,6,7,8};typedef int int_array[4];for (int_array *p = begin(a); p != end(a); p++){ for (int* q = begin(*p); q != end(*p); q++) { cout << *q << endl; }}
方法七:类别名+范围for
int a[3][4] = {1,2,3,4,5,6,7,8};typedef int int_array[4];for (int_array &p : a){ for (int q : p) { cout << q << endl; }}
方法八:auto
int a[3][4] = {1,2,3,4,5,6,7,8};for (auto p = a; p != a + 3; p++){ for (auto q = *p; q != *p + 4; q++) { cout << *q << endl; }}
方法九:auto+迭代
int a[3][4] = {1,2,3,4,5,6,7,8};for (auto p = begin(a); p != end(a); p++){ for (auto q = begin(*p); q != end(*p); q++) { cout << *q << endl; }}
方法十:auto+范围for
int a[3][4] = {1,2,3,4,5,6,7,8};for (auto &p : a){ for (auto q : p) { cout << q << endl; }}
参考文献:
[1]《C++全方位学习》范磊——第十四章
[2]《C++程序设计教程(第二版)》钱能——第三章
[3]《C++Primer(中文版)》王刚、杨巨峰——第三章
[4] 百度搜索关键字:C++数组、二维数组、二维数组的初始化、数组元素在内存中的分布、多维数组
0 0
- C++基础---多维数组
- C多维数组
- c.传递多维数组
- C语言----多维数组
- C程序设计基础之多维数组的指针变量
- C程序设计基础之多维数组的指针变量
- ioS开发之c语言基础-多维数组,字符串
- C语言基础(六)指针和多维数组
- 多维数组转一维数组(C)
- Java SE 基础:多维数组
- C语言与多维数组
- C语言中的多维数组
- C语言中的多维数组
- c++primer之多维数组
- C语言中的多维数组
- C 指针和多维数组
- [C语言]多维数组指针
- C语言malloc多维数组
- sudo apt-get命令大全
- C++基础---枚举
- Android_开源框架_Afinal
- 友元函数
- C++基础---数组
- C++基础---多维数组
- Keepalived简介
- C++基础---指针数组与数组指针
- 多线程
- 我自己的noip复习(实时更新)
- 【Python】virtualenv —— 建立Python虚拟环境
- 算法题:剔除字符串(很有意思)
- python爬虫 爬取淘女郎介绍以及照片
- APACHE2.X 禁止服务器IP直接访问