数组就是相同类型元素的集合,
基本语法如下:
type arr_name[元素个数];,比如:
int arr[5];//创建一个整型数组,该数组有5个值
存放在数组中的值为称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型。
有时候创建数组需要直接在数组中存放值,所以给定初始值,就叫做初始化
数组的初始化一般使用大括号,将数据括在大括号里
//完全初始化
int arr1[3] = {1,2,3};
//不完全初始化
int arr2[4] = {1,2};
//错误的初始化,初始化值太多
int arr3[3] = {1,2,3,4};
数组的类型区别与元素的类型,是一个全新的概念,比如 int a = 3;int就是a的数据类型,但是int arr[3]={1,2,3};它的数组的类型就是:int [3]。即:
去掉数组名,去掉初始化值,剩下的部分为数组的类型
C语言规定数组是有下标的,且下标从0开始计数,也就说假如有n个元素,那么最后一个元素的下标就是n-1,下标相当于数组元素的编号,比如:
int arr[5] = {1,2,3,4,5};
在C语言中数组的访问提供了一个操作符:[ ] ,叫做:下标引用操作符
有了下标引用操作符,就可以轻松的访问数组中的元素的,比如要查找下标为3的元素就可以写为arr[3],比如:
int main()
{
int arr[5] = {1,2,3,4,5};
printf("%d\n", arr[3]);//打印4
return 0;
}
只要依次产生所有元素的下标,就可以用打印所有的数组元素,所以可以使用for来完成:
int main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);//打印1 2 3 4 5 6 7 8 9 10
}
return 0;
}
既然可以使用for循环来实现数组元素的打印,那么也可以使用循环来完成数组元素的输入:
int main() {
int arr[10];
for (int i = 0; i < 10; i++) {
scanf("%d", &arr[i]);
}
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
return 0;
}
依次打印数组元素的地址:
int main() {
int arr[5] = { 1,2,3,4,5 };
for (int i = 0; i < 5; i++) {
printf("%p\n", &arr[i]);
}
return 0;
这是16进制数,每个地址之间相差4个字节,因为int类型占4个字节,所以:
数组元素在内存中的存储时连续存放的
在遍历数组时我们想知道数组中元素的个数,就可以使用sizeof
sizeof时C语言中的一个关键字,是可以计算类型或者变量的大小的,单位是字节 sizeof也可以计算数组的大小
int main() {
int arr[10] = { 0 };
printf("%zd\n" ,sizeof(arr));
return 0;
}
该数组的大小为:40字节,这是因为有10个int类型的元素,而int类型的大小为4字节,所以大小为4*10=10.
然后我们可以计算一个数组元素的大小:
int main() {
int arr[10] = { 0 };
printf("%zd\n" ,sizeof(arr[0]));
return 0;
}
所以可以用总的元素的大小除以一个元素的大小就可以得到元素的个数了。
int main() {
int arr[10] = { 0 };
printf("%zd\n" ,sizeof(arr)/sizeof(arr[0]));
return 0;
}
一维数组是相同元素的集合,而二维数组就是一维数组的集合,二维数组以上的数组称为多为数组
创建形式:
type arr_name[行数][列数]
比如:
int arr[2][3];//创建了一个2行3列的二维数组
二维数组的初始化与一维数组的初始化大同小异
//完全初始化
int arr1[2][3] = {1,2,3,4,5,6);
//不完全初始化
int arr2[2][3] = (1,2,3};
//错误初始化,超出限制
int arr3[2][3] = {1,1,1,1,1,1,1,1,1,1,1,1};
//按照行初始化
int arr4[2][3] = {{1,2,3}{1,1,1}};
二维数组也是由下标来访问的,它是有行和列的,其也是从0开始,如果有n行m列,那么末尾数组元素的下标为:n*m-1.
初始化的时候第一行元素放满了就会放第二行。
int main() {
int arr[2][3] = { 1,2,3,2,3,4 };
printf("%d", arr[1][2]);//使用下标查找
return 0;
}
运用循环的嵌套,先循环打印出行,在打印第一行的时候循环打印列,如此循环就可以完成二维数组的输入与输出
int main() {
int arr[3][4];
for (int i = 0; i < 3; i++) {//产生行号
for (int j = 0; j < 4; j++) {//产生列号
scanf("%d", &arr[i][j]);//输入
}
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
二维数组在内存中的存储像一维数组一样,也是每个元素连续存放。
int main() {
int arr[2][3] = { 1,2,3,2,3,4 };
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%p\n", &arr[i][j]);
}
}
return 0;
}
数组是一个比较简单的知识,但是其中也有相对较难理解的点,下面看看这两道题目,可以巩固学到的知识。
多个字符从两端移动,向中间汇聚
二分查找