数组
数组是一连串在内存中连续存储的相同数据类型的元素集合,并且每个元素都可以通过唯一的索引来访问。
以上是一个含有 5个 int 类型数据的数组。
可以这样来声明它, int foo [5];
注意: 中括号里是数组的长度,必须是常量,因为数组是一系列静态内存块,其大小在编译时就确定了。
数组初始化
tips:
- 对于一般的定义在函数内部的数组,在声明时,不会自动初始化。
- 对于定义在函数外部或者在
namespace
内部的数组,在声明时,会自动初始化(对于基本数据类型,默认值是 0)。
几种初始化方式介绍:
方式一:
int foo [5] = { 16, 2, 77, 40, 12071 };
方式二:
int bar [5] = { 10, 20, 30 };
方式三:
int foo [] = { 16, 2, 77, 40, 12071 };
//编译器自动根据 {} 中的元素个数推断数组大小
数组同样适用统一初始化方式:
//两者相等
int foo[] = { 10, 20, 30 };
int foo[] { 10, 20, 30 };
多维数组
声明一个二维数组:
int jimmy [3][5];
访问其中一个元素:
jimmy[1][3]
数组的维数越多,占据的内存空间也会指数型地增加。
示例:
char century [100][365][24][60][60];
//century 数组有超过 3 billion 个 char 元素,会占据超过
//3 gigabytes (30 亿字节)的内存
利用二维数组和简单数组解决同一个问题:
//二维数组方式
#define WIDTH 5
#define HEIGHT 3
int jimmy [HEIGHT][WIDTH];
int n,m;
int main ()
{
for (n=0; n<HEIGHT; n++)
for (m=0; m<WIDTH; m++)
{
jimmy[n][m]=(n+1)*(m+1);
}
}
//简单数组方式
#define WIDTH 5
#define HEIGHT 3
int jimmy [HEIGHT * WIDTH];
int n,m;
int main ()
{
for (n=0; n<HEIGHT; n++)
for (m=0; m<WIDTH; m++)
{
jimmy[n*WIDTH+m]=(n+1)*(m+1);
}
}
两种方式初始化后的数组 jimmy 内存状态如下:
数组作为参数
在 c++ 中,数组作为函数参数,传递的是其引用地址,并非拷贝,因为
由于历史原因,数组不能被直接拷贝。
示例:
// arrays as parameters
#include <iostream>
using namespace std;
void printarray (int arg[], int length) {
for (int n=0; n<length; ++n)
cout << arg[n] << ' ';
cout << '\n';
}
int main ()
{
int firstarray[] = {5, 10, 15};
int secondarray[] = {2, 4, 6, 8, 10};
printarray (firstarray,3);
printarray (secondarray,5);
}
多维数组也可以作为函数参数:
void procedure (int myarray[][3][4])
//上述数组参数,3 和 4 分别表示了另外两个维度的大小,这对编译器是
//必要的。
数组类型容器
c++ 的 array
库提供了数组定义的模板容器,容器数组除了具有普通
数组的操作以外,还可以被拷贝。
以下用普通数组和容器数组实现相同的例子:
//普通数组
#include <iostream>
using namespace std;
int main()
{
int myarray[3] = {10,20,30};
for (int i=0; i<3; ++i)
++myarray[i];
for (int elem : myarray)
cout << elem << '\n';
}
//容器数组
#include <iostream>
#include <array>
using namespace std;
int main()
{
array<int,3> myarray {10,20,30};
for (int i=0; i<myarray.size(); ++i)
++myarray[i];
for (int elem : myarray)
cout << elem << '\n';
}
字符序列
指针
动态内存
数据结构体
其他数据类型