一、为什么要用数组
具有相同属性的若干个数据组织成一个整体,这组数据就称为一个数组
数组是有序数据的集合
数组中每一个元素都属于同一个数据类型
用一个统一的数组名和下标来唯一的确定数组中的元素
数组的名字代表数组首元素的地址,而不是代表数组中的全部元素的值
二、怎样定义和引用一个数组
1、怎样定义一维数组
在定义数组时需要指定这批变量的类型、数组名称和数组中包含多少个元素
类型 数组名[常量表达式];
说明:
- 数组名的命名规则和变量名相同,遵循标识符命名规则
- 在定义数组时,需要指定数组中元素的个数
- 下标是从 0 开始的
- 常量表达式中包括常量和符号常量,不能包含变量,即数组的大小不依赖于程序运行过程中变量的值
2、怎样引用一维数组的元素
数组名[下标]
定义数组时用到的“数组名[常量表达式]”和引用数组元素时用到的“数组名[下标]”,在形式上相似,但在含义上和用法上是不同的
判别方法:看前面是否带有类型名即可区分
3、一维数组的初始化
对数组元素的赋值可以通过赋值语句来实现,也可以在定义数组时同时给予初值,这就称为数组的初始化
// 定义数组时对全部数组元素赋初值
int a[3] = {0,1,2};
// 只给一部分元素赋值
int a[3] = {0};
// 在对全部数组元素赋初值时,由于数据的个数是确定的,因此可以在定义数组时不指定数组长度,系统会根据数据的数量确定数组的长度
int a[] = {0,1,2,3,4};
// 如果所定义的数组的长度和初始化的数据的个数相同,则定义数组时可以不写数组长度
// 如果希望数组的长度与提供初值的个数不同,则数组的长度不能省略
4、一维数组程序举例
斐波那契数列问题:数组序号为 i 的元素的值是其前两个元素值之和
#include <stdio.h>
int main(){
int i;
int f[20] = {1,1};
for(i = 2; i < 20; i++){
f[i] = f[i - 2] + f[i - 1];
}
for(i = 0; i < 20; i++){
if(i % 5 == 0){
printf("\n");
}
printf("%12d",f[i]);
}
printf("\n");
return 0;
}
运行结果:
1 1 2 3 5
8 13 21 34 55
89 144 233 377 610
987 1597 2584 4181 6765
三、怎样定义和引用二维数组
1、怎样定义二维数组
类型 数组名[常量表达式][常量表达式];
用矩阵形式表示二维数组,是逻辑上的概念,形象的表示出行和列的关系
而在内存中存放数组是物理上的实现,是线性的、连续存放的,而不是二维的
2、怎样引用二维数组的元素
数组名[下标][下标]
3、二维数组的初始化
与一维数组类似
四、字符数组
用来存放字符数据的数组是字符数组
字符数组中的一个元素存放在一个字符
字符数组的定义与初始化可以使用一维数组或二维数组,引用方式也是类似
1、字符串和字符串结束标志
在 C 语言中,是将字符串作为字符数组来处理的
C 语言规定了以字符 ‘\0’ 作为字符串结束标志
编译系统在处理字符常量时会自动加一个 ‘\0’ 结束符
字符串作为一维数组存放在内存中
可以用字符串常量来使字符数组初始化,也可以省略大括号
char c[] = {"abc"};
char c[] = "abc"
对数值型数组,未赋值的部分元素值默认为0
对字符数组,未赋值的部分元素默认值为空字符
2、怎样进行字符数组的输入输出
逐个字符输入输出(%c)
将整个字符串一次性输入或输出(%s)
char c[] = "China";
printf("%s",c);
- 输出字符不包括结束符
- 用 “%s” 格式符输出字符串时,printf 函数中的输出项是字符数组名,而不是数组元素名
- 如果数组长度大于字符串的实际长度,也只输出到遇到 “\0” 结束
- 如果一个字符数组中包含一个以上 ‘\0’ ,则遇到第一个时输出就结束
- 可以用 scanf 函数输入一个字符串
- scanf 函数中的输入项如果是字符数组名,不要再加地址符 &,因为在 C 语言中数组名代表该数组的起始地址
- 如果想知道数组 str 在内存中的起始地址,可以用以下输出语句:
printf("%d",str);
3、字符串处理函数
如果将两个字符进行比较,所谓大者是指字符的 ASCII 码较大的那个字符
比较三个字符串,输出最大者
#include <stdio.h>
#include <string.h>
int main(){
char string[20];
char str[3][20];
int i;
for(i = 0;i < 3;i++){
gets(str[i]);
}
if(strcmp(str[0],str[1]) > 0){
strcpy(string,str[0]);
}else{
strcpy(string,str[1]);
}
if(strcmp(str[2],string) > 0){
strcpy(string,str[2]);
}
printf("The largest string is:\n%\n",string);
return 0;
}
运行结果:
CHINA
HLOLLAND
AMERICA
The largest string is:
HOLLAND
一 叶 知 秋,奥 妙 玄 心