通俗的说,数组就是存储一批相同类型数据的容器。
<类型> 数组变量名[元素数量]
例如:
int x[10]; // 数组长度为10的int型数组
float x[10]; // 数组长度为10的float型数组
char x[10]; // 数组长度为10的字符数组
注意:元素数量必须是一个正整数且在C99标准以前,元素数量必须是个确定的数。
例如,下列定义在C99标准以前是不正确的:
int N = 10;
int x[N];
基本格式:数组名[下标]
为方便理解,可以将一维数组用一个一行N列的线性表格来表示。
例如int x[10]
可以用下列表格表示:
访问数组的元素和访问其他类型的变量类似,例如:
scanf("%d", &x[0]); // 读入一个数,并存放到x[0]中
printf("%d", x[1]); // 输出x[1]的值
x[2] = 2; // 将x[2]赋值为2
a = x[3]; // 把x[3]的值赋给变量a
特别提醒:
C语言中,数组下标范围是0到n-1,而不是1到n。而C语言不要求检查下标的范围。因此,当下标超出范围时,程序可能会执行不可预知的行为。
int a[3] = {0};// 将所有元素初始化为0
int a[3] = {1, 2, 3};// 对每个元素分别赋值为1、2、3
int a[] = {1, 2, 3};// 对每个元素赋值,并让编译器自己计算数组的大小
int a[6] = {1, 2};// 将前两个元素赋值为1和2,剩下赋值为0
循环常常与一维数组结合进行赋值和输出。例如:
// 通过循环对一维数组的每一个元素赋值
int a[10];
int i;
for (i = 0; i < 10; i++) {
scanf("%d", &a[i]);
}
// 通过循环输出一维数组的每一个元素
int a[10]={1,2,3,4,5,6,7,8,9,10};
int i;
for (i = 0; i < 10; i++) {
printf("%d\n",a[i]);
}
<类型> 数组变量名[维数1][维数2]
例如:
int x[5][9];// 定义一个5行9列的二维数组
基本格式:
x[i-1][j-1]
表示二维数组x的第i行第j列的元素。
为方便理解,可以将而维数组用一个N行M列的表格来表示。
例如int x[5][9]
可以用下列表格来表示:
与一维数组一样,二维数组在访问时同样需要注意越界问题。
二维数组本质上是数组的数组,即以数组作为数组元素的数组。在内存中,二维数组和一维数组一样是以线性方式存储的。以上述int x[5][9]
为例,其在内存中的存储结构如下图所示
int x[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int x[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int x[3][4]={{1,2},{5,6},{9,10}};
// 等价于
int x[3][4]={{1,2,0,0},{5,6,0,0},{9,10,0,0}};
int x[3][4]={1,2,3};
// 等价于
int x[3][4]={1,2,3,0,0,0,0,0,0,0,0,0};
int x[][4]={1,2,3,4};
// 等价于
int x[1][4]={1,2,3,4};
C语言中通常使用char数组来存储字符串。
char str1[5] = {'e', 's', 't', 'a', '\0'}; // 单独初始化元素
char str2[] = {'e', 's', 't', 'a', '\0'}; // 不写数组大小
char str3[] = {"esta"}; // 使用字符串常量初始化字符数组
char str4[] = "esta"; // 使用字符串常量初始化,可以省略大括号
字符串的存储结构与字符数组类似,但在结尾处会有一个\0
,\0
为转义字符,表示字符串的结束标志。例如:
scanf("%s",str); // 读入(注意,不用写&)
printf("%s",str); // 输出
注意:在使用下述字符串处理函数时,需要导入头文件string.h
使用方法:strlen(str)
功能:用于返回指定字符串变量str的长度。
举例:
// 注意strlen和sizeof的区别
char str[] = "esta";
printf("strlen(str):%d\n", strlen(str));
printf("sizeof(str):%d", sizeof(str));
输出结果:
strlen(str):4
sizeof(str):5
解释:
sizeof计算的是整个字符数组的长度,包括\0
使用方法:strcpy(str1, str2)
功能:将str2拷贝到str1中,包含最后的结束符 ‘\0’。
注意:
1.为了避免溢出,必须确保用于存放的数组长度足以容纳待拷贝的字符串(长度需要包含结束符 ‘\0’)。
2.不能直接使用"="(赋值语句)将一个字符串拷贝给另一个字符串变量,亦不可直接用"="(赋值语句)对一个字符数组赋值(定义该变量时除外)。
使用方法: strcat(str1, str2)
功能:将一个字符连接到目标字符串后边,在此过程将覆盖第一个参数的结束符 ‘\0’。
使用方法: strcmp(str1, str2)
功能:用于比较两个字符串的大小。具体地说:
从第一个字符开始,依次比较每个字符的 ASCII 码大小,直到发现两个字符不相等或结束时(‘\0’)为止。
返回值 | 意义 |
---|---|
<0 | 字符串 1 的字符小于字符串 2 对应位置的字符 |
=0 | 两个字符串的内容完全一致 |
>0 | 字符串1 的字符大于字符串 2 对应位置的字符 |
举例:
int res = strcmp("esta", "hhu");
printf("%d",res);
输出结果():
-1
解释:
该函数依次遍历每个对应位置的字符。由于e 从本例中我们可以看出,strcmp函数的返回值与字符串长度无关,只与字符串对应位置上的字符ASCII码值大小有关。附录
ASCII码表