第六讲:数组
1.什么是数组
数组是一组相同元素的集合
数组中必须要有元素,元素个数不能为0
一个数组中存放的多个数据,类型是相同的
2.一维数组
2.1数组的创建
1 type arr_name[常量值];
//type是指数组元素的类型
//arr_name是指数组的名字,由自己起,有意义就行
//[]中的常量是用来指定数组的大小的
注意:
[ ]中的值必须是常量,不能是变量
2.2数组的类型
1 int arr [10]
2 int arr2[5]
3 char ch [4]
数组除去数组的名称就是这个数组的类型
arr 的数据类型是 int [10]
arr2的数据类型是 int [5]
char的数据类型是 char [4]
2.3一维数组在内存中的存储
对于上面的代码,运行结果为:
可知:随着下标的增长,地址是从小到大变化的,并且每两个相邻元素地址的差值为4(因为一个整形是4个字节)
由此:数组在内存中是连续存放的
2.4sizeof计算数组元素个数
对于sizeof函数的详解,参考:
链接: sizeof函数详解
3.二维数组
3.1概念
一维数组是数组元素的集合
二维数组是一维数组的集合
具体如下:
3.2二维数组的创建
type arr_name[常量值1][常量值2];
例如:
int arr[3][5];
double data[2][8];
3.3二维数组的初始化
3.3.1直接初始化
这种初始化是对数组进行了直接的初始化,从第【0】【0】个元素开始
3.3.2按行初始化
二维数组也可以按照行进行初始化:
当我们这样进行初始化时,就实现了按行初始化,结果如下:
3.3.3注意事项
需要注意的是,二维数组在初始化时可以省略行数,但是不能省略列数:
int arr5[][5] = {1,2,3};
3.4二维数组的下标
3.5二维数组在内存中的存储
二维数组在内存中也是连续存放的
4.C99中的变长数组
在C99标准中给出了一个变长数组,允许我们可以使用常量来指定数组大小
#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;
}
此时,我们就可以这样来输入变量的大小
注意:
变长数组不允许初始化数组
5.练习
5.1练习1
多个字符从两端移动,向中间汇聚
5.2⼆分查找(折半查找)
5.2.1要求
升序的数组(必须是升序的数组)中查找指定的数字n,使用二分查找。
⽐如我买了⼀双鞋,你好奇问我多少钱,我说不超过300元。你还是好奇,你想知道到底多少,我就让你猜,你会怎么猜?你会1,2,3,4…这样猜吗?显然很慢;⼀般你都会猜中间数字,⽐如:150,然后看⼤了还是⼩了
这就是⼆分查找,也叫折半查找。
5.2.2代码实现
6.所有代码展示
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//一维数组在内存中的存储
int main()
{
int arr[4] = { 1, 2, 3, 4 };
int i = 0;
for (i = 0; i < 4; i++)
{
printf("%p\n", &arr[i]);
}
return 0;
}
//二维数组的初始化
int main()
{
//不完全初始化
int arr[4][4] = { 1, 2, 3, 4, 5, 6 };
//完全初始化
int arr1[4][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8};
return 0;
}
//按行初始化
int main()
{
//按行初始化
int arr[3][4] = { {1, 2}, {3, 4}, {5, 6} };
return 0;
}
//多个字符从两端移动,向中间汇聚
#include <windows.h>
int main()
{
char arr[] = "hello world!";
char arr1[] = "************";
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 2;
printf("%s", arr1);
while (left <= right)
{
Sleep(1000);
system("cls");
arr1[left] = arr[left];
arr1[right] = arr[right];
printf("%s", arr1);
left++;
right--;
}
return 0;
}
//二分查找
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
int search = 0;
printf("请输入您需要查找的数字:");
scanf("%d", &search);
while(left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] > search)
{
right = mid - 1;
}
else if (arr[mid] < search)
{
left = left + 1;
}
else if (arr[mid] == search)
{
printf("所查找的数字的下标为:%d", mid);
break;
}
}
if (left > right)
{
printf("没找到!");
}
return 0;
}