数组
一、数组的类型
一般一个变量的类型就是去掉变量名后的其余部分
int arr1[10] ---- 类型:int [10]
char ch[5] ---- 类型:char [5]
二、arr[3]
的不同含义
1.作为变量名
int arr[3] = {
1, 2, 3};
2.引用数组(下标)
注意: 数组的下标是从0开始的
int arr[4] = {
1 ,2 ,3 ,4 };
printf("%d", arr[3]);// 打印的是下标为3的元素,即4
三、一维数组在内存中的存储
先看看下面这段代码,输出1个数组10个连续元素的地址:
#include <stdio.h>
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] = %d\n", i, &arr[i]);
}
return 0;
}
运行结果如下:
可以得出一个结论:数组在内存中是连续存放的
四、计算元素个数
使用 sizeof()
函数
int sz = sizeof(arr)/sizeof(arr[0]);
五、二维数组
1.初始化
二维数组初始化,可以省略行,但不可以省略列。见如下代码:
int arr[][10] = {
1,2};
2.在内存中的存储
二维数组在内存中的存储,和一维数组类似。二维数组就是把它看作一行,把第二行和第三行都移到第一行,所以得出一个结论:二维数组中每个元素都是连续存放的。
六、数组练习
例1.多个字符从两端移动,向中间汇聚
#include <stdio.h>
#include <string.h>
#include <Windows.h>
int main()
{
char arr1[] = "Welcome to HIT.";
char arr2[] = "***************";
int left = 0;
int right = strlen(arr1) - 1;// right和left都是下标,所以需要-1
printf("%s\n", arr2);
while (left <= right)
{
Sleep(1000);
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right--;
printf("%s\n", arr2);
}
return 0;
}
例2.⼆分查找
#include <stdio.h>
int main()
{
int arr[10] = {
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 = (right + left) / 2;
if (arr[mid] < key)
right = mid - 1;
else if (arr[mid] > key)
left = mid + 1;
else
{
find = 1;
break;
}
}
if (1 == find)
printf("找到了\n");
else
printf("找不到\n");
return 0;
}
其中 mid = (right + left) / 2
有时候会因为 left
和 right
过大,而无法正确给 mid
赋值,所以此时我们需要换一种写法:mid = left + (right + left) / 2