小case:在写数组前补充函数中的一点,函数可以嵌套调用,但是不能嵌套定义(即函数的内部不能定义函数)。C语言函数的定义都是相互平行的、相互独立的。
数组
首先,数组数组,顾名思义就是很多数据的组合。数组是真正意义上的存储数据的结构。虽然前面学习的变量也能存储数据,但变 量所能存储的数据很有限。不仅如此,数组和指针是相辅相成的,学习数组可以为学习指针打 下基础。
那么这些数据有没有什么要求呢,是不是不管什么 数据组合在一起都是数组呢?同一数组中存储的数必须满足以下两个条件:
1.
这些数据的类型必须相同。
2.
这些数据在内存中必须是连续存储的。
换句话说,数组是在内存中连续存储的具有相同类型的一组数据的集合。
一维数组的创建
类型说明符 数组名
[
常量 ||
表达式
];
eg:long long int arr[5]
它表示定义了一个长整型数组,数组名为
a
,定义的数组称为数组
a
。数组名
a
除了表示该数组之外,还表示 该数组的首地址
此时数组
a
中有
5
个元素,每个元素都是long long
int
型变量,而且它们在内存中的地址是连续分配的。
这里的元素就是变量的意思,数组中习惯上称为元素。
在定义数组时,需要指定数组中元素的个数。方括号中的常量表达式就是用来指定元素的个数。数组中元素 的个数又称数组的长度。
数组中既然有多个元素,那么如何区分这些元素呢?方法是通过给每个元素进行编号。数组元素的编号又叫 下标。
数组中的下标是从
0
开始的(而不是
1
)。那么,如何通过下标表示每个数组元素的呢?通过
“
数组名
[
下标
]” 的方式。例如“int a[5];”
表示定义了有
5
个元素的数组
a
,这
5
个元素分别为
a[0]
、
a[1]
、
a[2]
、
a[3]
、
a[4]
。
其中
a[0]
、
a[1]
、
a[2]
、
a[3]
、
a[4]
分别表示这
5
个元素的变量名。
为什么下标是从
0
开始而不是从
1
开始呢?试想,如果从
1
开始,那么数组的第
5
个元素就是
a[5]
,而定义数组时是 int a[5]
,两个都是
a[5]
就容易产生混淆。而下标从
0
开始就不存在这个问题了!所以定义一个数 组 a[n]
,那么这个数组中元素最大的下标是
n–1
;而元素
a[i]
表示数组
a
中第
i+1
个元素。
另外,方括号中的常量表达式可以是
“
数字常量表达式
”
,也可以是
“
符号常量表达式
”
。但不管是什么表达式, 必须是常量,绝对不能是变量。通常情况下 C
语言不允许对数组的长度进行动态定义,换句话说,数组的大 小不依赖程序运行过程中变量的值。非通常的情况为动态内存分配,此种情况下数组的长度就可以动态定义。
一维数组初始化
1>
定义数组时给所有元素赋初值,这叫
“
完全初始化
”
。
eg:int arr[2]={1,2};
通过将数组元素的初值依次放在一对花括号中,如此初始化之后,
a[0]=1
;
a[1]=2
;
即从左到右依次赋给每个元素。需要注意的是,初始化时各元素间是用逗号隔开的,不是用分号。
2>
可以只给一部分元素赋值,这叫
“
不完全初始化
”
。
eg:int[6]={6};
不完全初始化时,没有被初始化的元素自动为
0
。
也不能写成
“int a[5]={}
;
”。如果大括号中什么都不写,那就是极其严重的语法错误。大括号中最少要写一个数,
这时就是给数组
“
清零
”
,此时数组中每个元素都是零。此外,如果定义的数组的
长度比花括号中所提供的初值的个数少,也是语法错误,如
“a[2]={1
,
2
,
3
,
4
,
5}
;
”
。
注意:字符数组的初始化方式比较丰富
:
![](https://i-blog.csdnimg.cn/blog_migrate/98b554ea7030ef23a4c8cabd5a6a1116.png)
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/0c4a6287e5113e2230b5e983e18b3fe5.png)
由于这里我是用‘%s'打印,所以98自动转换为了相应的ASCII码b。
3>
如果定义数组时就给数组中所有元素赋初值,那么就可以不指定数组的长度,因为此时元素的个数已经确定了。编程时我们经常都会使用这种写法,因为方便,既不会出问题,也不用自己计算有几个元素,系统会自动分配空间。
这章概念性东西比较多,数组就是这样。下一节开始数组的使用,使用数组多半都是要遍历数组的,自己多敲代码,锻炼手感和思维。