一、数组
数组
即有序的元素序列。
在C语言中,数组可以看作是基本数据类型的有序集合
一)数组的基本使用
1、数组的声明
类型 变量名[数组长度];
例如:
int a[4];
2、数组的赋值
a. 先声明,再赋值
变量名 = {数据1, 数据2, 数据3…}
例如:
int a[4];
a = {1, 2, 3, 4};
b. 声明数组同时赋值
类型 变量名[数组长度] = {数据1, 数据2, 数据3…};
采取这种方式赋值的数组可以省略数组长度。
例如:
int a[4] = {1, 2, 3, 4};
int b[] = {1, 2, 3, 4}; //省略了数组长度
c. 先声明,再使用数组下标进行赋值
请见下面的“数组元素的使用”
3、数组元素的使用
使用数组中的元素,代码格式为:
变量名[数组下标]
- 数组下标即元素在数组中的位置
- C语言中的数组下标是从0开始的,所以数组的第一个元素是 a[0]
例如:
int a[] = {1, 2, 3, 4};
printf("%d", a[2]); // 输出3
// 因为数组下标是从0开始的,所以a[2]代表了数组a的第3个元素,即“3”
我们还可以为数组元素重新赋值:
int a[] = {1, 2, 3, 4};
printf("%d", a[2]);
a[2] = 6;
printf("%d", a[2]); // 输出6
所以,我们找到了另一种为数组元素赋值的方式:
int a[4];
a[0] = 1;
a[1] = 2;
a[2] = 3;
a[3] = 4;
二)说明
1. 数组的长度
- 数组的长度在声明的时候已经确定,不能更改。如果使用数组元素时,数组下标超过了数组的长度,会发生
数组越界
,造成程序的崩溃,一定要注意。 - 类似于 int a[] = {1, 2, 3, 4} ,即使我们没有直接定义数组的长度,但系统也已经确定了数组的长度。
2.数组的默认值
如果我们没有为数组元素赋值,那么它的默认值就是0;
int a[4];
printf("%d\n", a[0]); // 输出0
printf("%d\n", a[1]); // 输出0
printf("%d\n", a[2]); // 输出0
printf("%d\n", a[3]); // 输出0
建议记住这个特性,可能会用到。
3.数组占用的空间
数组占用空间 = 数组长度 x 对应数据类型占用的空间
我们可以用 sizeof()函数获取数据占用的字节数
例如:
#include<stdio.h>
void main()
{
printf("%d\n", sizeof(int)); // 输出4
int a[4];
printf("%d\n", sizeof(a)); // 输出16
}
所以,根据数组占用空间的计算公式,我们可以推算数组长度的公式:
数组长度 = 数组占用空间 ÷ 对应数据类型占用的空间
#include<stdio.h>
void main()
{
int a[4] = {1, 2, 3, 4};
printf("数组a的长度为 %d", sizeof(a) / sizeof(int)); // 输出4
}
二、二维数组与多维数组
一)二维数组
二维数组可以看作是数组的数组。常用来表示矩阵。
1、二维数组的声明
数组类型 变量名[行数][列数];
int a[3][2]; // 声明一个3行2列的数组, 声明时不能省略行和列长度
2、二维数组的赋值
a. 直接赋值
int a[][2] = {{1,2}, {3,4}, {5,6}}; //直接赋值时可以省略行的长度
int b[][2] = {1,2,3,4,5,6}; // 计算机会自动根据列的长度将其分为二维数组
b. 间接赋值
参考“二维数组的使用”
3、二维数组的使用
变量名[行数][列数]
二维数组也是数组,所有它的第一个元素是[0][0]。
int a[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}}; // 为了便于观看,经常将二维数组写成这种形式
printf("%d", a[2][1]); // 输出8
二)多维数组
三维及以上的数组称为多维数组。
如:
- 三维数组可以看作二维数组的数组
- 四维数组可以看作三维数组的数组
- …
多维数组声明和使用遵循着从高维到低维的顺序.
例:
int a[4][3][2]; // 4个”3行2列”的二维数组
a[2][2][1] = 6; // 第3个数组的“第3行第2列”的值为6
三、字符串
字符串
即一串字符,它可以看作是特殊的字符数组。
1、字符串的声明
a. 与字符数组相同
b. 可以用 char *变量名
表示
例如:
char a[4];
char *b;
2、字符串的赋值
a. 使用双引号
b. 与字符数组相同
例如:
// 使用双引号
char *a = "Hello C";
char b[] = "Hello C";
// 字符数组的方式
char c[] = {'H', 'E', 'L', 'L', 'O'};
char c[3];
c[0] = 'B';
c[1] = 'O';
c[2] = 'Y';
char d[4];
d = "girl";
char *e;
e = {'a', 'b', 'c'};
3、说明:
-
字符串的末尾是’\0’
-
'\0’只是一个标志,它并不占用字符串的长度
-
计算机会根据 ‘\0’ 来判断一个字符串的长度并输出它
#include<stdio.h>
void main()
{
char a[] = {'H', 'E', 'L', '\0', 'L', 'O'};
printf("%s", a);
}
猜猜上面的程序会输出什么?
没错,它输出的是 “HEL”。在遇到“\0”的时候,计算机把它当作了字符串的结尾,所以不会再输出“\0”后面的字符。
我们可以利用 strlen() 函数获取字符串的长度。
试着运行下面的程序,观察它的输出,并想一想为什么。
#include<stdio.h>
void main()
{
char a[] = {'H', 'E', 'L', '\0', 'L', 'O'};
printf("字符串长度:%d\n", strlen(a));
printf("数组占用空间:%d字节\n", sizeof(a));
printf("数组的长度:%d\n", sizeof(a) / sizeof(char));
}
4、获取输入的字符串
可以利用gets()
函数获取输入的字符串:
#include<stdio.h>
void main()
{
char a[20]; // 注意,这里不能使用 char *a, 而且必须指定字符串的长度, 这个长度代表了输入的最大长度
gets(a);
printf("你输入的是: %s", a);
}
小练习
输入5个整数,将它们存入数组,并倒序输出这5个整数。
参考答案
#include<stdio.h>
void main()
{
int a[5]; // 声明一个长度为5的数组
for(int i = 0; i < 5; i++) // 这时i的取值分别为 0,1,2,3,4
scanf("%d", &a[i]); // i正好对应了1-5号元素的下标
for(int i = 5; i > 0; i--) // 这时i的取值分别为 5,4,3,2,1
printf("%d\n", a[i-1]); // i-1 的值正好对应了5-1号元素的下标
}
好了,文章到这里就结束了,我们下一节再见
每周五晚20:00更新