数组
数组是同一类型的,具有特定关系的数据的集合。数组的语法为:
type array_name[constExpre][constExpre]...
type是数组元素的类型,array_name是数组的名,每一个[]表示一个维度,其中的值是常量表达式,表示这一维的长度。
1. 数组的存储
一维数组在内存中是顺序存放的,地址是连续的,物理地址之间的次序关系与逻辑次序相同。数组名实际上是数组首元素的地址,是一个地址类型的常量,或者说指针常量,原则上不能被重新赋值。
二维数组在内存中也是连续存储的,例如数组float a[3][4]
表示定义了一个float型的二维数组,他有3行4列,因而也可以看做有3个长度为4的一维数组构成的,那么他的元素在内存中的存储顺序为:
2. 数组的初始化
如果只声明数组,而不初始化,对于局部作用域的非静态数组,会存在垃圾数据,对于static数组,则会被编译器初始化为0。
2.1 一维数组的初始化
- 给出数组的大小,并且给出全部元素的初始值
int a[10] = {0,1, 2, 3, 4, 5,6, 7,8, 9};
- 给出数组的大小,并给出部分元素的初始值,此时会从第一个元素开始按给出的值依次初始化数组元素,没有分配到初始值的元素按默认值初始化。
int b[10] = {0, 1, 2, 3};
- 不给出数组的大小,但给出全部元素的初始值,这时编译器根据所有元素推断出数组的大小。
int c[] = {0,1 ,2, 3, 4};
2.2 二维数组的初始化
- 给出数组两个维度的大小,并且列出全部的初始值
int aa[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
- 给出数组两个维度的大小,分行列出全部的初始值
int bb[3][4] ={(0, 1, 2, 3),(4, 5, 6, 7),(8, 9, 10, 11)};
- 给出数组两个维度的大小,分行列出部分元素的初始值,空下的位置依然按照默认值初始化
int cc[3][4] = {(0, 1), (4, 5 ), (6, 7, 8)};
- 给出数组列维度的大小,并且列出全部元素的初始值,这样编译器就能通过全部元素的个数和列维度的大小推断出行维度的大小
2.3 数组作为函数参数
数组名做函数的参数时,形参和实参都应该是数组名,类型要相同,传送的是数组元素首地址,对形参数组的改变会直接影响实参数组。例如如下示例程序,
//
// main.cpp
// Array
//
// Created by Evelyn on 2018/8/8.
// Copyright © 2018年 Evelyn. All rights reserved.
//
#include <iostream>
using namespace std;
//将数组的每一行的和计算并保存在每一行第一个元素处
void sum(int a[][4] ) {
int tmp = 0;
for(int i = 0; i < 3; i++) {
for(int j =0 ; j < 4; j++) {
tmp += a[i][j];
}
a[i][0] = tmp;
tmp = 0;
}
}
int main(int argc, const char * argv[]) {
//定义一个3行4列数组
int a[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
//输出数组元素
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 4; j++) {
cout << a[i][j];
}
cout << endl;
}
//调用sum函数
sum(a);
//输出首元素测试
cout << a[0][0] << endl;
cout << a[1][0] << endl;
cout << a[2][0] << endl;
return 0;
}
输出结果如下:
0 1 2 3
4 5 6 7
8 9 10 11
6
22
38
3. 基于范围的for循环
在上一小节中,我们看到用for循环来遍历数组元素的例子。一般来说,for循环的语法格式为:
for(循环变量初始化;循环次数控制; 循环变量的增值)
也就是说,我们必须要知道循环多少次,并且要有特定的方式来遍历。不同于这种方式,c++11提供了基于范围的for循环,可以在这两个条件都不知道的情况下来自动遍历整个容器(容器的内容在后面章节讲述)。它的语法为:
for(容器元素类型& 循环变量名:容器对象名),其中容器元素类型也可以用auto来代替,编译器会自动转换为相应的类型。
看下面的程序示例:
//使用基于范围的for循环输出数组
int b[] = {1, 2, 3};
for(auto& c: b) {
cout << c << " " << endl;
}