
前言:上篇文章分享了两个趣味小游戏的代码实现,这篇文章将会给大家继续分享数组的相关知识~
---数组是一组相同元素类型的集合;从这个概念中我们就可以发现2个有价值的信息:
1.数组中存放的是一个或者多个数据,但是数组元素个数不能为0
2.数组中存放的多个数据,类型是相同的。
---数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。
1 type arr_name【常量值】
//type指定的是数组中存放数据的类型,可以是:char,short,int float等,也可以是自己定义的类型;
//arr_name指的是数组名的名字,这个名字根据实际情况,起的有定义就行;
//【】中的常量是用来指定数组的大小的,这个数组的大小是根据实际的需求指定就行。存放在数组的值被称为数组元素,数组在创建的时候可以指定数组的大小和数组的元素类型。
1 //完全初始化
2 int arr【5】={1,2,3,4,5};
3
4 //不完全初始化
5 int arr2【6】={1};//第一个元素初始化为1,剩余的元素默认初始化为0
6
7 //错误的初始化-初始化项太多
8 int arr【3】={1,2,3,4};数组如果进行了初始化,数组的大小是可以省略的
数组也是有类型的,数组算是一种自定义类型,去掉数组名留下的就是数组的类型。
1 int arr【10】;
2 int arr2【12】;
3 char ch【5】;就 比如上面的arr数组的类型是 int【10】;
--c语言规定数组是有下标的,下标是从0开始的,假设数组中有n个元素,最后一个元素的下标是n-1,下标就相当于数组元素的编号,如下:
1 int arr【10】={1,2,3,4,5,6,7,8,9,10};数组 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
--在c语言中数组的访问提供了一个操作符【】,这个操作符叫做下标引用操作符,比如我们访问下标为7的元素,就可以使用arr【7】;
1 #include<stdio.h>
2
3 int main()
4 {
5 int arr[10]={1,2,3,4,5,6,7,8,9,10};
6 printf(%d\n,arr[7]");//8
7 return 0;
8 }一维数组的打印和输入就不过多介绍了,用循环的思路就可以;
--有了前面的知识,我们其实使用数组基本没有什么障碍了,如果我们要深入了解数组,我们最好能了解一下数组在内存中的存储;
我们通过代码来直观了解一下吧;
1 #include <stdio.h>
2 int main()
3 {
4 int arr[10] = {1,2,3,4,5,6,7,8,9,10};
5 int i = 0;
6 for(i = 0; i < 10; i++)
7 {
8 printf("&arr[%d] = %p\n ", i, &arr[i]);
9 }
10 return 0;
11 }输出结果:

运行这串代码之后我们可以发现,数组随着下标的增长,地址是由小到大变化的,并且我们发现每两个相邻的元素之间相差4(因为一个整型是4个字节),所以得出结论:数组在内存中是连续存放的。
前面讲的都是一维数组,数组的元素都是内置类型的,如果我们把一维数组做为数组的元素,这时候就是二维数组,二维数组作为数组的元素的数组被称为三维数组,二维数组以上的数组统称为多维数组。
1 type arr_name[常量值1][常量值2];
2
3 例如:
4 int arr[3][5];
5 double data[2][8];
//3表示数组有三行
//5表示每一行有5个元素,也就是有5列
//int 表示每个元素类型都是整型
//arr 是数组名,可以根据自己的需要指定名字1 int arr1[3][5] = {1, 2};
2 int arr2[3][5] = {0};
1 int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
1 int arr4[3][5] = {{1,2},{3,4},{5,6}};
1 int arr5[][5] = {1,2,3}; 1
2 int arr6[][5] = {1,2,3,4,5,6,7};
3 int arr7[][5] = {{1,2}, {3,4}, {5,6}};


--其实二维数组访问也是可以使用下标形式的,二维数组有行有列,只要锁定了行和列就能唯一锁定数组中的一个元素。
c语言规定,二维数组的行和列都是从0开始的;
1 int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
比如:我们说第二行,第四列,就可以快速定位到7。
1 #include <stdio.h>
2 int main()
3 {
4 int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
5 printf("%d\n", arr[2][4]);
6 return 0;
7 }--我们怎样访问整个二维数组呢,其实我们只要能够按照一定的规律产生所有的行和列的数字就行;以上一段代码中的arr数组为例,行的选择范围是0~2,列的取值范围是0~4,所以我们可以借助循环实现生成所有的下标。
1 #include <stdio.h>
2 int main()
3 {
4 int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
5 int i = 0;//遍历⾏
6 //输⼊
7 for (i = 0; i < 3; i++) //产⽣⾏号
8 {
9 int j = 0;
10 for (j = 0; j < 5; j++) //产⽣列号
11 {
12 scanf("%d", &arr[i][j]); //输⼊数据
13 }
14 }
15 //输出
16 for (i = 0; i < 3; i++) //产⽣⾏号
17 {
18 int j = 0;
19 for (j = 0; j < 5; j++) //产⽣列号
20 {
21 printf("%d ", arr[i][j]); //输出数据
22 }
23 printf("\n");
24 }
25 return 0;
26 }--像一维数组一样,我们如果想研究二维数组在内存中的存储方式,我们也是可以打印出数组所有元素的地址的,代码如下:
1 #include <stdio.h>
2 int main()
3 {
4 int arr[3][5] = { 0 };
5 int i = 0;
6 int j = 0;
7 for (i = 0; i < 3; i++)
8 {
9 for (j = 0; j < 5; j++)
10 {
11 printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
12 }
13 }
14 return 0;
15 }输出的结果:

从输出的结果来看,每一行内部的每个元素都是相等邻的,地址之间相差4个字节,跨行位置处的两个元素(如:arr[0][4]和arr[1][0]) 之间也是差4个字节,所以二维数组中的每个元素都是连续存放的。
c99中的变长数组这里就不讲了,感兴趣的可以评论区留言并私信联系我 ;
--编写代码,演示多个字符从两端移动,向中间汇聚:
1 #include<stdio.h>
2 #include<string.h>
3 #include<windows.h>
4 #include<stdlib.h>
5 int main()
6 {
7 char arr1[] = "welcome to bit!!!!!";//隐藏了一个\0;
8 char arr2 [] = "###################";
9 int left = 0;
10 int right = strlen(arr1) - 1;//strlen计算字符串的长度,但是不会算\0;减一得到下标
11 while (left <= right)
12 {
13 arr2[left] = arr1[left];
14 arr2[right] = arr1[right];
15 printf("%s\n", arr2);
16 Sleep(1000);
17 system("cls");
18 left++;
19 right--;
20 }
21 printf("%s\n", arr2);
22 return 0;
23 }注意:这里如果用sizeof计算元素的个数得减二,因为多个\0;
--给定一个升序的整型数组,在这个数组中查找到指定的值n,找到了就打印n的下标,找不到就打印“找不到”。
1 #include<stdio.h>
2 #include<stdbool.h>
3 int main()
4 {
5 int arr[] = { 1,2,3,4,5,6,7,8,9,10};
6 int k = 7;
7 int left = 0;
8 int right = sizeof(arr) / sizeof(arr[0]) - 1;//用sizeof计算数组中元素的个数再减一得到下标
9 bool function = false;
10 while(left <= right)
11 {
12 int mid = (right + left) / 2;
13 if (arr[mid] > k)
14 {
15 right = mid - 1;
16 }
17 else if(arr[mid]<k)
18 {
19 left = mid + 1;
20 }
21 else
22 {
23 printf("找到了,下标是%d\n", mid);
24 function = true;
25 break;
26 }
27 }
28 if (function == false)
29 {
30 printf("找不到\n");
31 }
32
33 return 0;
34 }补充:求中间 元素的下标,使用mid=(left+right)/2,如果left和right比较大的时候可能存在问题,可以使用下面的方式:
1 mid = left + (right-left) / 2;结语:本篇文章到此结束,感谢大家的支持,后续会持续更新c语言相关知识的分享;下一篇文章会更新c语言函数的知识分享。