-
数组的概念:
数组是一组相同类型元素的集合
数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。
-
一维数组的创建和初始化:
type arr_name[常量值];
存放在数组中的值被称为数组的元素,数组在创建的时候可以指定数组的大小和数组元素类型。
type指数组中存放的数据类型:char short int float等,也可以自定义。
arr_name:数组名字 [常量值]:数组大小
int math[20]; float score[8] char ch[2];
2.1数组的初始化--一般使用大括号,将数据放入大括号中
int num1[5] = { 1,2,3,4,5 };
int num2[5] = { 1,2,3 };
int num3[ ] = {1,2,3};-----3个元素
int num4[] = { 1,2,3,4,5,6 };//错误初始化---初始化项太多
2.2数组的类型
数组也是有类型的,数组算是一种自定义类型,去掉数组名留下的就是数组的类型。
如下:
int arr1[10];
int arr2[12];
char ch[8];
arr1数组类型是:int [10]; arr2数组类型是:int [12] ch数组类型是:char [8]
-
一维数组的使用:
3.1数组下标:c语言规定数组是有下标的,从0开始。
假设数组有n个元素,最后一个元素的下标是n-1. []:下标引用操作符
int main() {
int num1[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d", num1[6]); //7
return 0;
}
3.3数组的输入:
3.4数组的存储:
(1)数组在内存中存储是连续存储。
(2)随着下标的增长,地址是由小到大变化的。
-
size of计算数组元素个数:
size of:计算类型或变量大小的。-------返回值是size_t类型
size_t是无符号整型
printf("%d\n",sizeof(int));-----printf("%zd\n",sizeof(int));
printf(sizeof(10));
以后创建一个数组大小就是 int sz=sizeof(arr)/sizeof(arr[0]);
-
二维数组的创建:
如果把一维数组作为数组的元素,就是二维数组。二维数组作为数组元素的被称为三维数组。
5.1 二维数组的定义:type arr_name[常量值1][常量值2]^(行 列 )^;
例:
int arr[3][5];
double data[2][8];
解释:3表示数组有3行 5表示每一行有5个元素 int表示数组的每个元素都是整型类型
5.2 二维数组的初始化:
5.2.1 不完全初始化
int arr1[3][5]={1,2};
int arr2[3][5]={0};
5.2.2 完全初始化
int arr3[3][5]={1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};
int arr4[3][5]={{1,2},{3,4,5},{6,7}};
二维数组在初始化的时候,可以省略行,不能省略列。
int arr5[][5]={1,2,3};
5.3 二维数组的使用
二维数组行是从0开始的,列也是从0开始的。
5.4二维数组的访问:
5.5二维数组的输入输出:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
int i = 0;
for (i = 0; i < 3; i++) {
int j = 0;
for (j = 0; j < 5; j++) {
scanf("%d", &arr[i][j]);
}
printf("\n");
}
//输出
for (i = 0; i < 3; i++) {
int j = 0;
for (j = 0; j < 5; j++) {
printf("%d", arr[i][j]);
}
printf("\n");
}
return 0;
}
5.6二维数组在内存中的存储:
for (i = 0; i < 3; i++) {
int j = 0;
for (j = 0; j < 5; j++) {
printf("&arr[%d][%d]=%p\n",i,j, &arr[i][j]);
}
printf("\n");
}
二维数组在内存中也是连续存储的
c99中,引入了变长数组的概念。
int arr[10];
int arr[5+3];
int arr[3]={1,2,3};
vs中虽然支持了变长数组的语法,但是不是全部支持的。
变长数组是不支持vs的。 变长数组是不能初始化的。
int n=0;
scanf("%d\n",&n);
int arr[n];
例题:例1:多个字符从两端移动,向中间汇聚。
welcome to you!!!
w******************!
we****************!!
wel***************!!!
…
welcome to you!!!
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main() {
char arr1[] = "welcome to you!!!!";
char arr2[] = "******************";
int left = 0;
int right = strlen(arr1) - 1;
while (left<=right) {
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000);
system("cls");
left++;
right--;
}
return 0;
}
二分查找:
在一个指定的有序数组中,查找具体的一个数—二分查找
int[]arr={1,2,3,4,5,6,7,8,9,10};
int k=7;
在arr数组中,找7。若找到了,打印7,若找不到,打印找不到。
- 遍历查找
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
scanf("%d\n", &k);
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int find = 0;;
for (i = 0; i < sz; i++) {
if (k == arr[i]) {
printf("找出来了,下标输出结果是%d", i);
find = 1;
break;
}
}
if (find == 0) {
printf("找不到\n");
}
return 0;
}
求中间元素的下标:int mid=left+(right-left)/2
**折半查找(二分查找)算法:(必须是有序数组)**
1 2 3 4 5 6 7 8 9 10
每次查找求出中间元素下标,由中间元素下标锁定元素,和所求值比较
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
scanf("%d", &k);
//查找--二分查找
int left = 0;
int right = sz - 1;
int find = 0;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了,下标是%d:\n", mid);
find = 1;
break;
}
}
if (find == 0)
{
printf("找不到了");
}
return 0;
}
备注:
**Sleep();**叫休眠函数 ms 1000ms=1s
system 用来执行系统命令的
cls 清除窗口