定义:(Array)是一组具有相同类型的变量的集合。例如,对上例应用数组将10个成绩值存储在内存的一个连续区域中,使用一个统的名字 来标识这组相同类型的数据,这个名字称为数组名。构成数组的每个数据项称为数组元素(Elemen至C程序通过数组的下标(Subscript)实现对数组元素的访问。
例如,在前面的程序中,可以定义如下数组来存储5个学生的成绩。
int score[5];
在该声明语句中,int代表该数组的基类型(Base Type),即数组中元素的类型。下标的个数表明数组的维数(Dimension),本例中下标个数为1,表明数组score是一维数组。score后方括号内的数字代表数组元素的个数。因此,该语句通过指定数组元素的类型、名字和元素个数,定义了一个有5个元素的一维int型数组score。其在内存中的逻辑存储结构如图8-1所示。
90 | 80 | 70 | 100 | 95 |
0 1 2 3 4
注意:
A:数组的引用
数组名 [下标]
B:数组下标(index)都是从0开始
C:使用a[0]、a[1]、a[2]、a[3]、a[4]这样的形式访问每个元素
D:下标既可是常量,也可是整型表达式,允许快速随机访问,如a[i],可以像使用普通变量一样使用它
一维数组
例子:编程实现显示用户输入的月份(不包括闰年的月份)拥有的天数
注意:下标越界是大忌!
–编译程序不检查是否越界
–下标越界,将访问数组以外的空间
–那里的数据是未知的,不受我们掌控,可能带来严重后果
例子:
#include <stdio.h>
int main()
{
int a = 1, c = 2, b[5] = {0}, i;
printf("%p, %p, %p\n", b, &c, &a);
for (i=0; i<=8; i++)
{
b[i] = i;
printf("%d ", b[i]);
}
printf("\nc=%d, a=%d, i=%d\n", c, a, i);
return 0;
}
一维数组重要例子排序:
main(){
int a[100000];
int i,max,l;
cin>>n;
for(i=0;i<n;i++) cin>> a[i];
max=a[0];l=0;
for(i=1;i<n;i++){
if(max<a[i])
{ max=a[i];l=i}
cout<<l<<endl;
}
return 0;
}
main(){
int a[100000];
int i,j,max,l;
cin>>n;
for(i=0;i<n;i++) cin>> a[i];
for(j=0;j<n-1;j++)
{ l=j;
for(i=1;i<n;i++)
if(a[l]<a[i])
l=I;
if(l!=j) i=a[l],a[l]=a[j],a[j]=i;
}
return 0;
}
二维数组
一、二维数组的定义
当一维数组元素的类型也是一维数组时,便构成了“数组的数组”,即二维数组。二维数组定义的一般格式:
数据类型 数组名[常量表达式1] [常量表达式2] ;
例如:int a[4][10];
a数组实质上是一个有4行、10列的表格,表格中可储存40个元素。第1行第1列对应a数组的a[0][0],第n行第m列对应数组元素a[n-1][m-1]。
说明:当定义的数组下标有多个时,我们称为多维数组,下标的个数并不局限在一个或二个,可以任意多个,如定义一个三维数组a和四维数组b:
int a[100][3][5];
int b[100][100][3][5];
多维的数组引用赋值等操作与二维数组类似。
二、二维数组元素的引用
二维数组的数组元素引用与一维数组元素引用类似,区别在于二维数组元素的引用必须给出两个下标。
引用的格式为:
<数组名>[下标1][下标2]
例:int a[3][5];
a是二维数组(相当于一个3*5的表格),共有3*5=15个元素,它们是:
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4]
a[1][0] a[1][1] a[1][2] a[1][3] a[1][4]
a[2][0] a[2][1] a[2][2] a[2][3] a[2][4]
因此可以看成一个矩阵(表格),a[2][3]即表示第3行第4列的元素。
例子:
#include<iostream>
#include<iomanip>
const int n=3;
using namespace std;
int a[n+1][n+1];
int main()
{
for (int i=1; i<=n; ++i)
{
for (int j=1; j<=n; ++j)
cin>>a[i][j];
}
for (int i=1; i<=n; ++i)
{
for (int j=1; j<=n; ++j)
cout<<setw(5)<<a[j][i];
cout<<endl;
}
return 0;
}
常见错误小节
常见错误实例
a(rr5) 使用圆精号引用数组元素 matrix(2,3) 用圆抗号,且将行个圆话号号内引用数组元素行下标标和列下标写在1个圆括号内引用数组元素
matrix[2,3] 行下标和列下标写在了一个方框内
arr={1,2,3,4,5} 试图用数组名接收对数组元素的整体赋值
int axr[4]=(1,2,3,4,5} 对数组元素进行初始化时提供的初值个数多于数组元素的个数
int arr[n] 使用变量而非整型常量来定义数组的长度
忘记对需要进行元素 初始化的数组进行初始化将导致运行结果错误 没有意识到数组的下标都是从0开始的,在访问数组元素时发生下标“多1"或者运行时错误“少1”的操作,从而引发越界访向内存错误
max=FindMax (score[],n) 函数调用时,实参数组名后跟着对空的方括号
max=FindMax (int score[],int n) 按照函数定义首部的形参列表书写函数编译错误调用语句中实参列表
函数原型、函数定义和函数调用,在形参和实参的数量以及返回值的类型上未严格保持一致
感想:多写多练