目录
1.数组
数组是一种储存一组相同类型元素的集合。首先数组里需要有元素,至少要为1个。其次数组里的元素是类型相同的。
数组分为一维数组和多维数组。
2.一维数组
2.1创建
在C语言中,一维数组的创建涉及指定数组的类型、大小和初始值。
①指定数组类型
在C语言中,数组可以存储不同类型的元素,但在创建数组时必须指定元素的类型。在C语言中,数组的元素类型可以是任何合法的C数据类型。以下是一些常见的数组元素类型:
整数类型 int short long longlong
浮点类型 float double
字符类型 char
其实可以发现跟变量的类型类似
②设置数组名
这一部分跟变量的命名一样,不能以数字开头,由字母、数字、下划线组合构成。
③指定数组大小
即数组中可以放几个元素。用[ ] 括起来放在数组名后面。
2.2 初始化
2.2.1 完全初始化
在声明数组的同时为每个元素提供初始值。
我们可以看到,数组的三个元素分别被赋值为1,2,3.
2.2.2 不完全初始化
我们可以看到,数组的第一个元素被赋成了1,而其他的值默认为0;
2.3 引用
2.3.1 单个元素的引用
对于单个的变量,我们想用的时候直接使用变量名即可,而对于 数组,它包含很多元素,显然我们不能直接引用数组名。在C语言中,对于数组中的元素会进行编号,假设有n个元素,编号从0开始到n-1结束。
举个例子,下面的一维数组
int arr[5]={10,9,8,7,6}
编号 | 0 | 1 | 2 | 3 | 4 |
对应的数组元素 | 10 | 9 | 8 | 7 | 6 |
比如我想打印8,我们可以看到它对应的编号是2,那么我们可以用arr[2]来引用它。
请看下面的代码:
2.3.2 打印整个数组
当我们知道如何引用一个元素以后,我们就可以利用循环,来打印整个数组了。
请看下面的代码
2.4 数组的输入
与单个变量的输入类似,我们在输入数组元素的时候也需要用scanf()函数,同样的再利用循环即可完成。
2.5 存储
一维数组在内存中是怎么存储的呢,我们可以用取地址来观察一下。
执行程序
通过观察我们可以得知,相邻两个元素的地址相差4,而int类型的数据在存储的时候刚好占用四个字节,因此可以得出结论,一维数组在内存中连续存储。
2.6 计算元素个数
在之前的学习中,我们知道,sizeof关键字可以计算变量的大小,比如我们还知道int类型是4个字节。同样的sizeof也可以计算数组的数组的大小。请看代码:
而数组又是由相同类型的元素组成,相同元素的大小也是一样的。因此我们可以得出公式
数组的大小=元素个数*单个元素的的大小
那么元素个数=数组大小/单个元素的大小
请看代码
答案是5个
3 二维数组
我们知道一维数组是由单个元素组成的,而如果将一维数组的单个元素换成以为数组,那么本来这个一维数组就变成了二维数组。
3.1 创建
在C语言中,二维数组的创建也涉及指定数组的类型、大小和初始值。
①指定数组类型
在C语言中,数组可以存储不同类型的元素,但在创建数组时必须指定元素的类型。在C语言中,数组的元素类型可以是任何合法的C数据类型。以下是一些常见的数组元素类型:
整数类型 int short long longlong
浮点类型 float double
字符类型 char
其实可以发现跟变量的类型类似
②设置数组名
这一部分跟变量的命名一样,不能以数字开头,由字母、数字、下划线组合构成。
③指定数组大小
即数组中可以放几个元素。用[ ] [ ] 括起来放在数组名后面。
3.2 初始化
3.2.1 完全初始化
针对下面的二维数组,arr[3][4]
表示总共有3行,每一行4个元素,那么这个二维数组总共有12个元素,给他12值,就是完全初始化。
我们还可以观察到,赋值的时候,先给一行赋值,当一行的四个元素赋值结束以后,再给其他行赋值。这个现象在不完全初始化的时候更加明显。
3.2.2 不完全初始化
针对下面的二维数组,arr[3][4]
表示总共有3行,每一行4个元素,那么这个二维数组总共有12个元素,给他部分值,就是不完全初始化。
只给他赋三个值
只有第一行的前三个元素被赋值了,其他元素默认为零。
我们再来看一下。
当第一行的四个元素赋值结束以后,才会将第五个元素赋值给第二行的第一个元素。
3.2.3 按行初始化
刚才我们说了,如果连续给它赋值,我们可以发现当他给第一行完全赋值以后,才会给第二行进行赋值。其实我们还可以给每一行都部分赋值,我们刚才说了,其实二维数组,就是将一维数组的元素换成了一维数组,因此二维数组的元素可以看成尤为数组吗,那我们直接给它赋值一维数组即可,请看代码。
3.3.4 省行初始化
在初始化的时候我们还可以把第一个[ ] 里的数字省略,这个时候,行号没有了,称为省行初始化,这个时候,根据赋值的元素的数目进行分行,如果给的列数是5,那么如果给的元素数目小于等于5,那么就为一行。大于5小于等于10,就为两行,以此类推。
3. 3引用
3.3.1 单个元素的引用
对于单个的变量,我们想用的时候直接使用变量名即可,而对于 数组,它包含很多元素,显然我们不能直接引用数组名。在C语言中,对于二维数组中的元素会进行编号,会既要给行进行编号,也要对列进行编号,假设有m行,n列,那么行号就从0开始到m-1结束,列号从0开始到m-1;
列号 | |||||
0 | 1 | 2 | 3 | ||
行号 | 0 | 1 | 2 | 3 | 4 |
1 | 5 | 6 | 7 | 8 | |
2 | 9 | 10 | 11 | 12 |
我们想打印8的时候,我们可以看到他行号为1,列号为3,我们可以用arr[1][3] 来使用。
3.3.2 打印整个数组
当我们知道如何引用一个元素以后,我们就可以利用循环,来打印整个数组了。
请看下面的代码
3.4 数组的输入
与单个变量的输入类似,我们在输入数组元素的时候也需要用scanf()函数,同样的再利用循环即可完成。
3.5 存储
二维数组在内存中是怎么存储的呢,我们可以用取地址来观察一下。
执行代码
通过观察我们可以得知,相邻两个元素的地址相差4,而int类型的数据在存储的时候刚好占用四个字节,因此可以得出结论,二维数组在内存中连续存储。
4.数组的应用——初识二分查找
这种方法当然可以,然而如果很不幸,数字在最后一个,那么这个时间就太长了
如果我们分开看,找到数组中间的数,如果大了就把前面的数分一半再找,反之反过来,这种分而治之的方法就是二分法,代码可以这样写。
//初识二分查找
#include <stdio.h>
int main()
{
int arr[10] = { 2,4,6,8,10,12,14,16,18,20 };
//如何快速的找到这一组数据中6的位置呢?
//第二种方法:二分查找。
int key = 6;//要找的数
int left = 0;
int right = sizeof(arr) / sizeof(arr[1]) - 1;
//最后一个元素的编号是数组的个数-1
while (arr[right] != key && arr[left] != key)
{
int mid = left + (right - left) / 2;
if (left<=right)
{
if (arr[mid] > key)
{
right = mid - 1;
left += 1;
}
else if (arr[mid] < key)
{
left = mid + 1;
right += 1;
}
else
{
printf("找到了,在数组的第%d位\n", mid + 1);
break;
}
}
else
{
printf("找不到\n");
break;
}
}
if (arr[left]==key)
printf("找到了,在数组的第%d位\n",left+1);
else if (arr[right] == key)
printf("找到了,在数组第%d位\n", right+1);
return 0;
}