• 微信号
  • 微信号
您当前的位置:首页 > 学海无涯 > 茑语花香>C++ 数组讲解

C++ 数组讲解

孤峰 孤峰家 2023-09-21 113人阅读

这次,我来讲解一下关于 C++ 中数组的知识。

下文中的数组如果没有特别指出其类型 ( 如一维数组,二维数组 ),都是指所有类型的数组

数组,意思就是多个数所组成的一个组,我们可以利用这个组进行一些基本的操作。

为什么要有数组

数组的作用是什么?我们来看看这个例子 : 当我们要输入一些数字,然后对这些数字进行一些操作,如求总和,求平均数或找出这些数字的某一个。这时,我们不可能定义超多个变量来存储数字,所以,我们就需要数组。

一维数组的定义与使用

一维数组是这样定义的

int a;//定义一个变量(int类型)

int b[10];//定义一个数组(int类型)

同样的,还有别的类型的数组

long long a;//定义一个变量(long long类型)

long long b[10];//定义一个数组(long long类型)

short c;//定义一个变量(short类型)

short d[10];//定义一个数组(short类型)

float e;//定义一个变量(float类型)

float f[10];//定义一个数组(float类型)

//当然还有double,bool,char类型的数组

现在,我们来看看定义一维数组时的结构是怎么样的

int a[10];

//int是变量类型

//a是数组名称,当想要使用此数组时就要用这个名称

//中括号("[]")是指明数组的"下标",用于确定数组的某一位置上的数字

//中括号中的数字是数组大小,用于确定数组的存储范围

//也就是说,中括号内的数字是可以变的,也可以是一个变量(前提是变量定义过)

//与变量是一样的,数组也不允许使用相同的名称

int b[999];

int c[9999999];

#define N 1000//定义N,值为1000

int d[N];

//这样就是错的(重复定义了a)

int a[10];

int a[20];

一维数组的存储是这样的

数组下标从 0 ~ N,每一个位置都代表 ( 储存 ) 一个数字

每一位都存储着一个数字,当你想要知道 a 的第一个位置的值时,就可以调用 a[1],a[1] 所代表的数就是数组 a 当中第一个位置上的数。一维数组的输入,输出,使用与变量是类似的。

int a[1000];

//输入/输出数组a的第一个值

cin>>a[1];

cout<<a[1]<<endl;

//输入/输出数组a的第二个值

cin>>a[2];

cout<<a[2]<<endl;

//输入/输出数组a的第N(10)个值

int N=10;

cin>>a[N];

cout<<a[N]<<endl;

//将数组a的第一个值与第二个值相加并赋值至a的第三个值当中

a[3]=a[1]+a[2];

输入一维数组的方法

一维数组的作用是存储多个变量,那么我们就要很好的利用数组的下标。例如我们要输入 n 个数,那么我们不可能这样子输入:

int a[1000],n;
cin>>a[1]>>a[2]>>a[3]>>a[4]>>...>>a[n-2]>>a[n-1]>>a[n];

这样子输入实在是太麻烦了,我们要好好利用下标:

int a[1000],i,n;

cin>>n;

for(i=1;i<=n;i++) cin>>a;

这样就可以方便又可控的输入 n 个数了。

一维数组的空间

这些数字存储在 a 这个一维数组中 , 占用的空间自然是它的长度了 , 一个一维数组最多能够有多少项变量?下面我们来看看

#include<iostream>

#include<cstdio>

using namespace std;

int a[1000];

//这里定义了 a 这个一维数组的空间大小

//说明它最多能够存储 10000001 个 int 类型的变量

int **in()

{

cin>>a[0];//一维数组下标为 0 的一位同样是可以使用的

cin>>a[-100];

//编译时可以通过,但是会导致程序崩溃,因为一维数组不存在 -100 位

//导致了数组的越界

cout<<a[-100]<<endl;

//输出同理

return 0;

}

值得注意的是,虽然一维数组下标大于定义空间大小时不会报错且能够正常输出,但是,它会影响到其他变量,使程序变得混乱。(有一次我就这样花了半个小时才发现——它会影响到其他数组)

当然,不是说将一维数组定义空间变得非常大就不会出现这样的情况了,例如下面的程序

#include<iostream>

#include<cstdio>

using namespace std;

int a[10000000000000000];

//哈哈,不会越界了

int **in()

{

cin>>a[233333333];

cout<<a[233333333];

return 0;

}

会直接报错,程序不能接收那么大的数字作为一维数组的定义空间

数组的初始化 ( 变量 )

数组和变量的值都是可以改变的,那么,它们一开始都是多少呢

这分为两种不同的情况 :

数组 ( 或变量 ) 定义在函数 ( 例如 **in 函数 ) 之外初始的值都为 0,只有提前赋值或在后面进行改变才会产生变化 ( 即 全局变量 )

数组 ( 或变量 ) 定义在函数之内的值为一个随机的数,如果没有初始化,会导致程序产生错误,例如有一个程序,要求记录整一个数组中所有值得总和,那么,我们定义一个变量 sum,进行累加,代码如下,那么计算出来的数就会不正确。解决它的两种方法就是要不将它定义在外面或提前将它赋值为 0

#include<iostream>

using namespace std;

int a[10000000],n,i;

int **in()

{

int sum;//没有初始化

cin>>n;

for(i=1;i<=n;i++) cin>>a;

for(i=1;i<=n;i++) sum+=a;

cout<<sum<<endl;

return 0;

}

全局变量可以在任意一个函数中使用到它,而在函数中的变量只能供函数自己使用

二维数组

通过上面的介绍,相信你已经了解了一维数组,那么,我们现在来看看二维数组

二维数组与一维数组较大的区别就是多了一维,意思就是一维数组只能够存储一条线上的变量,而二维数组可以存储一个面上的变量

例如,这里有一张地图,我需要把它存下来

图:

AABAA

AABAA

AABAA

AABAA

AABAA

如果我们使用一维数组存储下来也不是不行,只是有些麻烦

如果我们使用二维数组的话,这就会变得十分简单

#include<iostream>

using namespace std;

char a[1000][1000];

//字符类型的二维数组

//大小为 1000*1000

int **in()

{

int i,j;

for(i=1;i<=5;++i)

for(j=1;j<=5;++i)//这里不能使用同一个变量

cin>>a[j];//读入(i,j)这个点

return 0;

}

二维数组与一维数组有着同样的限制和特点,例如下标同样可以从 0 开始,下标不能小于 0,不能越界

最重要的一点是

#include<iostream>

using namespace std;

int a[1000000][1000000];

//a 所使用的空间不再是其中一个数值了

//而是两个数值相乘的积(思考一下,为什么)

int **in()

{

int i,j,n;

cin>>n;

for(i=1;i<=n;++i)

for(j=1;j<=n;++i)

cin>>a[j];

return 0;

}

例如 a 数值的大小为 [ N ] [ M ],那它所占用的空间就为 N*M

多维数组

通过前面一维数组和二维数组的学习,相信你一定会十分容易地使用多维数组了。

下面是多维数组

int a[10];

//这是一个一维数组

int b[10][10];

//这是一个二维数组

int c[10][10][10];

//这是一个三维数组

int d[10][10][10][10];

//这是一个四维数组

...

int h[10][10][10][10][10][10][10][10];

//这是一个八维数组...

使用方法也都类似,占用的空间大小也都是每一个下标的数相乘的积

文档下载

转载:感谢您阅览,转载请注明文章出处“来源从小爱孤峰知识网:一个分享知识和生活随笔记录的知识小站”。

链接:C++ 数组讲解http://www.gufeng7.com/niaolang/1849.html

联系:如果侵犯了你的权益请来信告知我们删除。邮箱:119882116@qq.com