C++笔记--数组
Posted ljt2724960661
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++笔记--数组相关的知识,希望对你有一定的参考价值。
C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。
数组定义是具有编译确定意义的操作,它分配固定大小的空间,就像变量定义一样的明确。因此元素个数必须是由编译时就能够定夺的常量表达式。下面这样的数组定义有问题:
int n=100;
int a[n];//错:数组元素个数必须是常量
分析: 虽然根据上下文,编译似乎已经知道n的值,但编译动作因变量性质而完全不同。变量性质就是具有空间占用的可访问实体,编译每次碰到一个变量名称就对应一个访问空间的操作。因此,int a[n]实际上要在运行时,才能读取变量n的值,才能确定其空间大小。这与数组定义的编译时确定意义的要求相违背,因而编译时报错。
而对于下面的定义,却是允许的。因为编译中,常量虽也占空间,甚至也涉及内存访问,但因数据确定,而可以被编译用常数替代。事实上,常量在编译时经常是优化的目标,能省略内存空间访问就应该省略,讲求效率的C++编译器会乐此不疲:
const int n=100;
int a[n]; // ok
初始化数组
在 C++ 中,您可以逐个初始化数组,也可以使用一个初始化语句,如下所示:
double balance[5] = 1000.0, 2.0, 3.4, 7.0, 50.0;
大括号 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。如果省略掉了数组的大小,数组的大小则为初始化时元素的个数。因此,如果:
double balance[] = 1000.0, 2.0, 3.4, 7.0, 50.0;
栗子:
#include <iostream>
using namespace std;
int main()
double numbers[] = 7, 5, 6, 12, 35, 27;
double sum = 0;
double count = 0;
double average;
cout << "The numbers are: ";
for (const double &n : numbers)
cout << n << " ";
sum += n;
// count the no. of array elements
++count;
cout << "\\nTheir Sum = " << sum << endl;
average = sum / count;
cout << "Their Average = " << average << endl;
return 0;
输出:
The numbers are: 7 5 6 12 35 27
Their Sum = 92
Their Average = 15.3333
多维数组
多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组,形式如下:type arrayName [ x ][ y ];其中,type 可以是任意有效的 C++ 数据类型,arrayName 是一个有效的 C++ 标识符。一个二维数组可以被认为是一个带有 x 行和 y 列的表格。
栗子:
#include <iostream>
using namespace std;
int main()
int test[3][2] = 2, -5, 4, 0, 9, 1;
for (int i = 0; i < 3; ++i)
for (int j = 0; j < 2; ++j)
cout << "test[" << i << "][" << j << "] = " << test[i][j] << endl;
return 0;
输出:
test[0][0] = 2
test[0][1] = -5
test[1][0] = 4
test[1][1] = 0
test[2][0] = 9
test[2][1] = 1
指向数组的指针
数组名是指向数组中第一个元素的常量指针。因此,在下面的声明中:double runoobAarray[50];
runoobAarray 是一个指向 &runoobAarray[0] 的指针,即数组 runoobAarray 的第一个元素的地址。因此,下面的程序片段把 p 赋值为 runoobAarray 的第一个元素的地址:
double *p;
double runoobAarray[10];
p = runoobAarray;
使用数组名作为常量指针是合法的,反之亦然。因此,*(runoobAarray + 4) 是一种访问 runoobAarray[4] 数据的合法方式。一旦您把第一个元素的地址存储在 p 中,您就可以使用 *p、*(p+1)、*(p+2) 等来访问数组元素。
栗子:
#include <iostream>
using namespace std;
int main ()
double runoobAarray[5] = 200.0, 2.0, 3.5, 18.0, 90.0;
double *p;
p = runoobAarray;
cout << "使用指针的数组值 " << endl;
for ( int i = 0; i < 5; i++ )
cout << "*(p + " << i << ") : ";
cout << *(p + i) << endl;
cout << "使用 runoobAarray 作为地址的数组值 " << endl;
for ( int i = 0; i < 5; i++ )
cout << "*(runoobAarray + " << i << ") : ";
cout << *(runoobAarray + i) << endl;
return 0;
输出:
*(p + 0) : 200
*(p + 1) : 2
*(p + 2) : 3.5
*(p + 3) : 18
*(p + 4) : 90
使用 runoobAarray 作为地址的数组值
*(runoobAarray + 0) : 200
*(runoobAarray + 1) : 2
*(runoobAarray + 2) : 3.5
*(runoobAarray + 3) : 18
*(runoobAarray + 4) : 90
以上是关于C++笔记--数组的主要内容,如果未能解决你的问题,请参考以下文章