首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C语言数组通关秘籍】--一维数组,二维数组,简单的二分查找

【C语言数组通关秘籍】--一维数组,二维数组,简单的二分查找

作者头像
草莓熊Lotso
发布2025-10-29 13:16:21
发布2025-10-29 13:16:21
1400
举报
文章被收录于专栏:C++/LinuxC++/Linux

前言:上篇文章分享了两个趣味小游戏的代码实现,这篇文章将会给大家继续分享数组的相关知识~


一.数组的概念

---数组是一组相同元素类型的集合;从这个概念中我们就可以发现2个有价值的信息:

1.数组中存放的是一个或者多个数据,但是数组元素个数不能为0

2.数组中存放的多个数据,类型是相同的。

---数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。


二.一维数组

1.一维数组的创建和初始化

1.1,数组创建
代码语言:javascript
复制
1 type arr_name【常量值】
//type指定的是数组中存放数据的类型,可以是:char,short,int float等,也可以是自己定义的类型;
//arr_name指的是数组名的名字,这个名字根据实际情况,起的有定义就行;
//【】中的常量是用来指定数组的大小的,这个数组的大小是根据实际的需求指定就行。

存放在数组的值被称为数组元素,数组在创建的时候可以指定数组的大小和数组的元素类型。

1.2. 数组的初始化
代码语言:javascript
复制
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.3.数组的类型

数组也是有类型的,数组算是一种自定义类型,去掉数组名留下的就是数组的类型。

代码语言:javascript
复制
1 int arr【10】;
2 int arr2【12】;
3 char ch【5】;

就 比如上面的arr数组的类型是 int【10】;

2.一维数组的使用

2.1.数组下标

--c语言规定数组是有下标的,下标是从0开始的,假设数组中有n个元素,最后一个元素的下标是n-1,下标就相当于数组元素的编号,如下:

代码语言:javascript
复制
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】;

代码语言:javascript
复制
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 }

一维数组的打印和输入就不过多介绍了,用循环的思路就可以;

2.2.一维数组在内存中的存储

--有了前面的知识,我们其实使用数组基本没有什么障碍了,如果我们要深入了解数组,我们最好能了解一下数组在内存中的存储;

我们通过代码来直观了解一下吧;

代码语言:javascript
复制
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.二维数组的创建和初始化

1.1.二维数组的创建
代码语言:javascript
复制
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.2.二位数组的初始化
#1.不完全初始化
代码语言:javascript
复制
1 int arr1[3][5] = {1, 2};
2 int arr2[3][5] = {0};
#2.完全初始化
代码语言:javascript
复制
1 int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
#3.按照行初始化
代码语言:javascript
复制
1 int arr4[3][5] = {{1,2},{3,4},{5,6}};
#4.初始化时省略行,但是不能省略列
代码语言:javascript
复制
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}};

2.二维数组的使用

2.1.二维数组的下标

--其实二维数组访问也是可以使用下标形式的,二维数组有行有列,只要锁定了行和列就能唯一锁定数组中的一个元素。

c语言规定,二维数组的行和列都是从0开始的;

代码语言:javascript
复制
1 int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};

比如:我们说第二行,第四列,就可以快速定位到7。

代码语言:javascript
复制
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 }
2.2. 二维数组的输入和输出

--我们怎样访问整个二维数组呢,其实我们只要能够按照一定的规律产生所有的行和列的数字就行;以上一段代码中的arr数组为例,行的选择范围是0~2,列的取值范围是0~4,所以我们可以借助循环实现生成所有的下标。

代码语言:javascript
复制
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 }
2.3.二维数组在内存中的存储

--像一维数组一样,我们如果想研究二维数组在内存中的存储方式,我们也是可以打印出数组所有元素的地址的,代码如下:

代码语言:javascript
复制
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.多个字符从两端移动,向中间汇聚

--编写代码,演示多个字符从两端移动,向中间汇聚:

代码语言:javascript
复制
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;

2.二分查找

--给定一个升序的整型数组,在这个数组中查找到指定的值n,找到了就打印n的下标,找不到就打印“找不到”。

代码语言:javascript
复制
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比较大的时候可能存在问题,可以使用下面的方式:

代码语言:javascript
复制
1 mid = left + (right-left) / 2;

结语:本篇文章到此结束,感谢大家的支持,后续会持续更新c语言相关知识的分享;下一篇文章会更新c语言函数的知识分享。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.数组的概念
  • 二.一维数组
    • 1.一维数组的创建和初始化
      • 1.1,数组创建
      • 1.2. 数组的初始化
      • 1.3.数组的类型
    • 2.一维数组的使用
      • 2.1.数组下标
      • 2.2.一维数组在内存中的存储
  • 三.二维数组
    • 1.二维数组的创建和初始化
      • 1.1.二维数组的创建
      • 1.2.二位数组的初始化
    • 2.二维数组的使用
      • 2.1.二维数组的下标
      • 2.2. 二维数组的输入和输出
      • 2.3.二维数组在内存中的存储
  • 三.数组练习
    • 1.多个字符从两端移动,向中间汇聚
    • 2.二分查找
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档