目录
1. 数组的概念
数组是⼀组相同类型元素的集合
- 数组中存放的是1个或者多个数据,但是数组元素个数不能为0
- 数组中存放的多个数据,类型是相同的
数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组。
2. ⼀维数组的创建和初始化
数组创建
⼀维数组创建的基本语法:
type arr_name[常量值];
存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型
- type指定的是数组中存放数据的类型,可以是:char、short、int、float等,也可以自定义的类型
- arr_name指的是数组名的名字,这个名字根据实际情况,起的有意义就行。
- []中的常量值是用来指定数组的大小的,这个数组的大小是根据实际的需求指定就行
例子
- 想存储某个班级的20人的数学成绩,就可以创建一个数组
int math[20];
- 可以根据需求其他类型和大小的数组
- char ch[8];
- double score[10]
数组的初始化
有的时候,数组在创建的时候,我们需要给定一些初始值,这种称为初始化
在这里插入代码片int main()
{
//完全初识化
int arr[5] = { 1,2,3,4,5 };
//不完全初始化
int arr2[6] = { 1 }; //第一个元素初始化为1,剩余的元素默认初始化为0
//错误的初识化 - 初始化项太多
int arr3[3] = { 1,2,3,4 };
return 0;
}
数组的类型
数组也是有类型的,数组算是一种自定义类型,去除数组名留下的就是数组的类型。
- int arr1[10];
- int arr2[12];
- char ch[5];
arr1数组的类型是int [10]
arr2数组的类型是int [12]
ch数组的类型是char [5]
3. ⼀维数组的使⽤
数组的下标
C语言规定数组是有下标的,下标是从0开始的,假设数组有n个元素。最后一个元素的下标是n-1,下标就相当于数组元素的下标
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
在C语言中数组的访问提供了一个操作符[] ,这个操作符叫:下标引用操作符。
有了下标访问操作符,我们就可以很轻松的访问到数组的元素了
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n", arr[7]); //8
printf("%d\n", arr[3]); //4
return 0;
}
数组元素的打印
接下来,如果想要访问整个数组的内容,应该如何呢?
只要我们产生数组所有元素的下标就可以了,使用for循环产生0~9的下标,接下来使用下标访问就行了。
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]); //1 2 3 4 5 6 7 8 9 10
}
return 0;
}
数组的输入
当我们明白了数组的访问,当然我们也根据需求,自己给数组输入想要的数据
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
4. ⼀维数组在内存中的存储
有了前面的知识,我们其实使用数组基本没有什么障碍了,如果我们要深入廖俊杰数组,最好能了解一下数组在内存中的存储。
依次打印数组元素地址
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
for (i = 0; i < 10; i++)
{
printf("&arr[%d]%p\n",i, &arr[i]);
}
return 0;
}
分析:
从输出的结果来看,数组随着下标的增长,地址是由小到大变化的,并且我们发现每两个相邻的元素之间相差4(因为一个整型是4个字节)
结论:
数组在内存中是连续存放的
5. sizeof计算数组元素个数
在遍历数组的时候,我们经常想要知道数组的元素格式,可以使用sizeof得出。
sizeof是C语言的一个关键字,是可以计算类型或者变量大小的,其实sizeof也可以计算数组的大小。
例子
int main()
{
int arr[10] = { 0 };
printf("%d", sizeof(arr));//40
return 0;
}
这里输出的结果是40,计算的是数组所占内存空间的总大小,单位是字节
我们又知道数组中所有元素的类型都是相同的,那只要计算出一个元素所占自己的个数,数组的元素个数就能算出来。
int main()
{
int arr[10] = { 0 };
printf("%d\n", sizeof(arr[0]));//计算一个元素的大小,单位是字节
return 0;
}
接下来就能计算出数组的元素个数:
int main()
{
int arr[10] = { 0 };
int sz = 0;
sz = sizeof(arr) / sizeof(arr[0]);
printf("%d", sz);
return 0;
}
这里的结果是:10,表示数组有10个元素。
以后在代码中需要数组元素个数的地方就不用固定写死了,使用上面的计算,不管数组如何变化,计算出的大小也就随着变化了。
6. ⼆维数组的创建
概念
前面学习的数组被称为一维数组,数组的元素都是内置类型的,如果我们把一维数组作为数组的元素,这时候就是二维数组,二维数组作为数组元素的数组被称为三维数组,二维数组以上的数组统称为多组数组。
创建
如何定义二维数组:
type arr_name[常量值1] [常量值2];
例子
int main()
{
int arr[3][5];
double data[2][8];
}
解释:上述代码的信息
- 3表示数组有3行
- 5表示每一行有5个元素
- int 表示数组的每个元素是整型类型的
- arr是数组名,可以根据自己的需求指定名字data数组意思基本一致
7. ⼆维数组的初始化
不完全初始化
int main()
{
int arr1[3][5] = { 1,2 };
int arr2[3][5] = { 0 };
return 0;
}
完全初始化
int main()
{
int arr3[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
return 0;
}
按照行初始化
int main()
{
int arr4[3][5] = { { 1,2 },{3,4},{5,6} };
return 0;
}
初始化时省略行,但是不能省略列
int main()
{
int arr5[][5] = { 1,2 ,3 };
int arr6[][5] = { 1,2,3,4,5,6,7 };
int arr7[][5] = { {1,2},{3,4},{5,6} };
return 0;
}
8. ⼆维数组的使⽤
二维数组的下标
当我们掌握了二维数组的创建和初始化,那又如何使用二维数组呢?
其实二维数组的访问也是使用下标的形式的,二维数组是有行和列的,只要锁定了行和列就能唯一锁定数组中的一个元素。
C语言规定,二维数组的行是从0开始的,列也是从0开始的:
int main()
{
int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
return 0;
}
图中最右侧绿色的十字表示行号,第一行蓝色的数字表示列号,都是从0开始的。
int main()
{
int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
printf("%d", arr[2][4]); //7
return 0;
}
二维数组的输入和输出
int main()
{
int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
int i = 0;
for (i = 0; i < 3; i++) //行
{
int j = 0;
for (j = 0; j < 5; j++) //列
{
scanf("%d", &arr[i][j]);
}
}
//输出
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
9. ⼆维数组在内存中的存储
像一维数组一样,我们若想研究二维数组在内存中存储方式,我们可以打印出数组所有元素的地址的。
int main()
{
int arr[3][5] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("&arr[%d][%d] = %p\n",i,j ,&arr[i][j]);
}
}
return 0;
}
从输出结果来看,每一行内部的元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素,所以二维数组中的每个元素都是连续存放的。
10. C99中的变⻓数组
在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使用常量、常量表达式、或者如果我们初始化数据的话,可以省略数组大小。
int main()
{
int arr1[10];
int arr2[3 + 5];
int arr3[] = { 1,2,3 };
return 0;
}
这样的语法限制,让我们创建数组就不够灵活,有时候数组大了浪费空间,有时候数组小了又不够用的。
C99中给一个变长数组的新特性,允许我们可以使用比那辆指定数组大小
1.int n = a+b;
2.int arr[n];
11. 数组练习
练习1:多个字符从两端移动,向中间汇聚
int main()
{
char arr1[] = "#################";
char arr2[] = "welcome to bit...";
int left = 0;
int right = strlen(arr2) - 1;
printf("%s\n", arr1);
while (left <= right)
{
arr1[left] = arr2[left];
arr1[right] = arr2[right];
left++;
right--;
printf("%s\n", arr1);
}
return 0;
}
练习2:⼆分查找
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int key = 0;
int left = 0;
int right = sizeof(arr) / sizeof(arr[0])-1;
int middle = 0;
int find = 0;
scanf("%d", &key);
while (left <= right)
{
middle = (left + right) / 2;
if (arr[middle] >key )
{
right = middle - 1;
}
else if (arr[middle] < key)
{
left = middle + 1;
}
else {
find = 1;
break;
}
}
if (find == 1) {
printf("找到了下标为%d", middle);
}
else {
printf("找不到");
}
return 0;
}