前言
先考虑这样的问题:当你被要求定义十个变量时,你会怎么办?可以像 a1,a2,a3···
这样一个一个的定义出来。但是,当你被要求定义一千个,一万个变量的时候呢?肯定就不能一个一个定义了,这时候,我们就要用到 数组 了。
数组的理解
数组,可以看作是把很多变量 串 起来,统一一下名字,再重新编个号,这样只需要知道它的名字和编号就可以访问这个变量了。
一、数组的定义
数组的定义方式为:int 变量名[数组大小];
,例 int a[b];
。
其中,b
应该是已知的整数,当 b
比较大时,就应该定义全局变量了,因为局部变量不能定义太大(暂时不讲为什么)。
容易看出,数组是有范围的,以 int a[b];
为例,其下标的范围是 \([\,0,b\,)\),也就是一个左闭右开的区间。
二、数组调用
数组越界:当下标超出数组的范围时,就会发生数组越界,会发生一些玄学错误。所以,在调用数组时一定要看看是否越界。
三、单独的变量与数组的对比
一般情况下,变量的定义像是下面这样的,比较分散。
int a1,b2,a2,c,d;
当我们调用时,需要用 a1
,b2
这样的语句。
现在我们把它们“串”起来,统一名字并编号,就会变成这样。
int a[5];
当我们访问数组时,就可以用 a[0]
,a[1]
这样的语句来调用数组,是不是方便了很多。另外,这也为循环结构提供了一个意义,就是遍历数组。
四、多维数组
上面所讲的是一维数组,类似的,我们可以把单个变量看作是零维数组,那么一维数组就是由很多个零维数组组成的。类比过来,二维数组就是由很多个一维数组组成\(\ \cdots\)
好,相信你已经能够理解数组了。
结构体
一、结构体的定义与调用
结构体可以看作自己定义一种新的数据类型,里面存储一些原有的数据类型,看起来比较集中。除此之外,结构体还有封装的作用,但这里不多讲。
声明结构体的格式
struct 结构体名{
你要往结构体里塞的东西,可以是变量也可以是函数;
};
注意! 不要忘了结构体 }
后面的 ;
。
例如:
struct tree{
int l,r;
int sum;
void upd(){
sum++;
}
}a[10],c;
tree b[10];
在这个例子中,我声明了一个叫作tree
的结构体,里面有三个int
型的变量l
,r
和 sum
。
声明不等于定义,定义一个已声明的结构体有两种方式,例子中都有体现。
第一种是在声明结构体时最后的 }
和 ;
之间定义变量。
第二种是像平时定义常见的 int
型那样,把 tree
当做一个数据类型直接定义变量或数组。
二、结构体的调用
结构体在调用时,需要在你定义的变量或数组的某个元素后面加个 .
,再加上结构体内部的变量名来实现调用。以刚才定义的结构体为例,可以这样调用:
a[1].l=1;
c.r=2;
a[1].upd();