目录
前言
今天咱来讲讲关于数组的那些事,本文将从数组的概念、一维数组、二维数组的创建与使用、延伸拓展、练习几个方面为大家详细阐述数组的方方面面。
一、数组的概念
数组(Array)顾名思义就是一堆数放在一起构成的组合,数组中的每个数称为数组元素,类似于数学当中的集合,数组元素规定必须为相同类型的元素(如int、char、指针等),写法大致如下:
int arr[10]
其中“int”表示数组元素类型,arr是我们为了方便对数组的使用,给数组起的数组名,之后中括号[ ]里面的数字表示此数组包含的元素个数
二、一维数组
1、概念
我们可以把每个数组中的元素想象成一个个点,将这些点串联在一起就构成了一条线,这条线就代表一维数组
2、一维数组的创建与初始化
(1)创建
正如我们在概念中的示例一样,我们可以按照数组元素类型,数组名,包含元素个数这三点创建出来一个一维数组,例如我们可以用int age[12]来表示十二个人的年龄集合
(2)初始化
下面我们进行数组的初始化
初始化可包括完全初始化和不完全初始化,我们用大括号内包含元素并用等号对数组赋值的形式来完成初始化,如:
1、int arr[5] = {1,2,3,4,5}
2、int arr[5] = {1}
1 表示完全初始化,即数组标明的元素个数正好等于初始化的元素个数
2表示不完全初始化,即数组标明的元素个数大于初始化的元素个数,此时数组中剩余的元素没有具体表明要赋的值,系统这时会默认其为0
(3)类型
数组的类型很容易记,只要把数组名的部分删掉,剩下的就是该数组的类型,如int arr[5]的类型是int [5]
(4)一维数组的使用
C语⾔规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1,下 标就相当于数组元素的编号,如下:
int arr[5] = {1,2,3,4,5}
//对应元素下标 0 1 2 3 4
若我们想要调用数组中的第一个元素,可以用arr[0](即数组名加下标)的形式来调用
三、二维数组
1、概念
一维数组可以想象成由点构成的一条线,二维数组则可以在此基础上想象为由线叠加构成的二维平面,平面可以划分成行和列
2、二维数组的创建与初始化
(1)创建
二维数组的创建与一维数组类似,
int arr[2][3]
我们可以把[2][3]分别看作一共有两行,每行包含三个元素,该数组中共可以装2*3 = 6个元素
(2)初始化
二维数组初始化也与一维数组类似,可分为以下几种:
a 完全初始化
int arr[2][3] = {{1,2,3},{4,5,6}}
b 不完全初始化
int arr[2][3] = {1,2,3,4}
c 按照行初始化
int arr[2][3] = {{1,2},{3,4}}
d 初始化时省略行,但是不能省略列
int arr[][3] = {1,2,3,4,5}
int arr[][3] = {1,2,3}
(3) 类型
二维数组去掉数组名即是其类型,如int arr[2][3] 的类型是 int [2][3]
(4)二维数组的使用
当我们掌握了⼆维数组的创建和初始化,那我们怎么使用二维数组呢? 其实⼆维数组访问也是使用下标的形式的,二维数组是有行和列的,只要锁定了行和列就能唯一锁定 数组中的一个元素。 C语言规定,二维数组的行是从0开始的,列也是从0开始的,如下所示:
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
0 | 1 | 2 | 3 | 4 | |
0 | 1 | 2 | 3 | 4 | 5 |
1 | 2 | 3 | 4 | 5 | 6 |
2 | 3 | 4 | 5 | 6 | 7 |
当我们要调用二维数组元素时,首先要找到它在哪一行,其次是哪一列,如arr[1][2]表示的就是第一行第二列的元素
四、延伸拓展
C99中的变长数组
在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使⽤常量、常量表达式,或者如果我们初始化数据的话,可以省略数组大小
例如
int arr1[10];
int arr2[3+5];
int arr3[] = {1,2,3};
这样的语法限制,让我们创建数组就不够灵活,有时候数组大了浪费空间,有时候数组又小了不够用的。 C99中给一个变长数组(variable-lengtharray,简称VLA)的新特性,允许我们可以使用变量指定数组大小
int n = a+b;
int arr[n];
上面示例中,数组 arr 就是变长数组,因为它的长度取决于变量 n 的值,编译器没法事先确定,只 有运行时才能知道 n 是多少。 变长数组的根本特征,就是数组长度只有运行时才能确定,所以变长数组不能初始化。它的好处是程序员不必在开发时,随意为数组指定一个估计的长度,程序可以在运行时为数组分配精确的长度。有一个比较迷惑的点,变长数组的意思是数组的大小是可以使用变量来指定的,在程序运行的时候,根据变量的大小来指定数组的元素个数,而不是说数组的大小是可变的。数组的大小一旦确定就不能再变化了
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
//根据输⼊数值确定数组的⼤⼩
int arr[n];
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
五、练习
练习1:多个字符从两端移动,向中间汇聚 编写代码,演⽰多个字符从两端移动,向中间汇聚
#include <stdio.h>
int main()
{
char arr1[] = "welcome to bit...";
char arr2[] = "#################";
int left = 0;
int right = strlen(arr1)-1;
printf("%s\n", arr2);
while(left<=right)
{
Sleep(1000);
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right--;
printf("%s\n", arr2);
}
retutn 0;
}
练习2:二分查找 在⼀个升序的数组中查找指定的数字n,很容易想到的方法就是遍历数组,但是这种方法效率比较低。比如我买了⼀双鞋,你好奇问我多少钱,我说不超过300元。你还是好奇,你想知道到底多少,我就让你猜,你会怎么猜?你会1,2,3,4...这样猜吗?显然很慢;⼀般你都会猜中间数字,比如:150,然 后看大了还是小了,这就是二分查找,也叫折半查找
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int left = 0;
int right = sizeof(arr)/sizeof(arr[0])-1;
int key = 7;//
要找的数字
int mid = 0;//
记录中间元素的下标
int find = 0;
while(left<=right)
{
mid = (left+right)/2;
if(arr[mid]>key)
{
right = mid-1;
}
else if(arr[mid] < key)
{
left = mid+1;
}
else
{
find = 1;
break;
}
}
if(1 == find )
printf("
找到了
,
下标是
%d\n", mid);
else
printf("
找不到
\n");