在c++中,有三个强而有力的工具,分别是数组,指针还有字符串,可以说,没有熟练掌握这三个工具的不能算是一个合格的程序员。
1.数组
数组,实际上就是向系统申请一个连续的内存空间,每个内存空间的地址连续,并且大小相同,关于数组的声明,语法如下:
类型说明符 数组名[常量表达式];
例如,我申请一个类型为整形,长度为100的数组,我可以这样声明:
int a[100];
这样,我就申请了一个长度为100的数组,并且数组的每个内存都是int类型的,其中a(array)是数组名,我们在访问数组中的内存时,可以利用中括号中的下标进行访问,例如,我要输出第一个内容,我就可以这样进行:
int a[100];
cout << a[0] << endl;
注意:数组中的下表是从0开始的,也就是说我这里只能从a[0] 访问到a[99],而a[100]并不在数组中,诺我们不小心访问到了a[100],则称这种情况叫数组越界,当读者今后在使用数组时,应该时刻注意数组是否有越界的情况,因为数组越界的后果是难以估量的。
在c++中,我们可以将数组的维度变高,引申为二维数组和三维数组甚至高维数组,接下来我以二维数组举例,其实二维数组我们既可以看作我们生活中的二维物品,事实上,我们也可以将二维数组变为一维数组,也就是将其变为一维数组的一维数组,这句话可能读者现在读起来十分拗口难懂,事实上,当你能弄清楚是怎么回事之后,在以后,所有的高维数组都可以这样操作。
例如,我声明一个二维数组:
int a[2][3];
这样一个数组,我们可以理解为行数为2,列数为3的一个二维数组,但其实我们也可以这样理解:
我们可以这么看,a[0]就表示一个长度为三的以位数组,而a[1]也是如此,将这两个以位数组连接在一起,就形成了我们声明的这个二维数组了,事实上,c++在处理数组是,就是这样的方式进行处理,包括更高维的数组,我们也是可以这样转变成为一个一维数组,这也是作者上文所说的一维数组的一维数组的含义。
在理解了这个之后,所有的高维数组都可以转变成类似于二维数组,以三维数组为例,我先声明一个三维数组a[2][2][3],这个我可以理解为有两行这样的数组如图:
其实就可以理解为有两行这样的二维数组,当然,如果读者不习惯的话,我们也可以向平常理解的那样。
最后,我们应该在什么时候使用数组呢?当我们涉及到大量的数据需要同时储存时我们就会用到数组,或者有多组数据需要输入时,我们也会用到数组,例如,我们在录入成绩时,需要连续输入数据,那么这个时候我们可以利用循环来进行遍历输入:
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
for (int i = 0; i < n; i++)
{
cout << a[i] << endl;
}
这样我们就可以完成多组数据的输入输出了。
关于数组的其他细节:
1.数组的名字代表这个数组的首地址,因此我们通常可以利用指针来访问数组元素,例如:
int* p;
int a[100];
p = a;
for (int i = 0; i < 100; i++)
{
cin >> a[i];
}
for (int i = 0; i < 100; i++)
{
cout << *(p + i) << endl;
}
2.获取数组长度的方法
我们可以用下列方法去获取一个数组的长度:
int a[100];
int len = sizeof(a) / sizeof(int);
我们利用sizeof函数去获取一个数组的长度,第一个sizeof(a)可以获取一个数组总的字节数,那么用总的字节数除以每个对应数组类型的字节就是这个数组对应的长度了。
3.把数组下标类比成数学上变量的下标
这句话怎么理解呢?例如:我们有这样一个递推式Fn = Fn-1 + Fn-2,那么我们要求这个数列的第n项,我们可以利用数组使用,将上述递推式转变成下列数组形式为F[n] = F[n - 1] + F[n - 2]。正常来说,我们这样去使用数组大多应用在动态规划问题(关于动态规划,读者可以去参考作者的另一篇文章(动态规划入门))。
4.关于高维数组的赋值
拿上述三维数组举例,我们对高维数组赋值都是从外围开始,外围指数组最外面的中括号,例如数组a[2][2][3]的赋值:
int a[2][2][3];
a[2][2][3] = {
{2,3,4}, {5,6,7}
{7,8,10},{2,5,1}
}
这里外围是3,那么每个大括号里面就要有三个数字,中间为2,所以一行要有两个大括号,最里面为2,所以这里需要两行,这样就完成了对一个三维数组的赋初值操作。
以上就是本文的全部内容了。