第五讲:数组
写自己的东西 不要做留声机 不要做写满字的纸 要做孤天的鹤 ——24.8.11
1.数组的概念
数组是一组相同类型元素的集合
数组中存放的是1个或者多个数据 但是数组元素个数不能是0
数组中存放的多个数据 类型是相同的
数组分为一维数组和多维数组 多维数组中比较多见的是二维数组
2.一维数组的创建和初始化
数组的创建:
type arr_name[常量值];
存放在数组的值被称为数组的元素 数组在创建的时候可以指定数组的大小和数组的元素类型
- trpe指定的是数组中存放数组的类型(char short int等类型)
- arr_name指的是数组名的名字(自己根据实际情况取就可以)
- []中的常量值用来指定数组的大小
数组的初始化
数组的初始化一般放在大括号中
//完全初始化
int arr[5]={1,2,3,4,5};
//不完全初始化
int arr2[6]={1};//第一个元素初始化为1,剩余的元素默认初始化为0
//错误的初始化-初始化项太多
int arr3[3]={1,2,3,4};
数组的类型
int arr1[10];
int arr2[12];
char ch[5];
- arr1的数组类型是int [10]
- arr2的数组类型是int [12]
- ch的数组类型是char[5]
3.一维数组的使用
数组下标
c语言规定数组有下标 下标从0开始 假设数组有n个元素 那么最后一个元素的下标是n-1 即
数组 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
下标引用操作符——[]
- 比如我们要访问下标为7的元素 我们可以使用arr[7]
- 比如我们要访问下标为3的元素 我们可以使用arr[3]
#include <stdio.h>
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
printf("%d\n",arr[7]);//8
printf("%d\n",arr[3]);//4
return 0;
}
数组元素的打印
只需要产生所有元素的下标(for循环)
//打印整个数组的内容
#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("%d",arr[i]);
}
return 0;
}
数组的输入
#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++)
{
scanf("%d",&arr[i]);
}
for(i=0;i<10;i++)
{
printf("%d",arr[i]);
}
return 0;
}
4.一维数组在内存中的存储
数组在内存中是连续存放的
5.sizeof计算数组元素个数
- 用sizeof计算数组所占内存空间的总大小
#include <stdio.h> int main() { int arr[10] = { 0 }; printf("%d\n", sizeof(arr)); return 0; }
- 因为数组中所有元素的类型是相同的 所以我们只需计算出一个元素所占内存空间
#include <stdio.h> int main() { int arr[10]={0}; printf("%d\n",sizeof(arr[0]));//计算一个元素的大小 return 0; }
-
接下来就能算出数组的元素个数
#include <stdio.h> int main() { int arr[10]={0}; int sz =sizeof(arr)/sizeof(arr[0]); printf("%d\n",sz); return 0; }
6.二维数组的创建
二维数组是把一维数组作为数组的元素
三维数组是把二维数组作为数组的元素
二维数组以上的数组统称为多维数组
定义二维数组
type arr_name[常量值1][常量值2];
例如:
int arr[3][5];
double data[2][8];
即
- 3表示数组有三行
- 5表示每一行有5个元素(5列)
- int表示数组的每个元素是整型类型
- arr是数组名 可以自己取
7.二维数组的初始化
不完全初始化
举个例子
int arr1[3][5]={1,2};
int arr2[3][5]={0};
完全初始化
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}};
初始化时省略行 但是不能省略列
int arr5[][5]={1,2,3};
int arr6[][5]={1,2,3,4,5,6,7};
int arr7[][5]={{1,2},{3,4},{5,6}};
8.二维数组的使用
二维数组的访问也是使用下标形式 只要锁定了行与列 就可以唯一确定数组中的元素
注意 无论是行与列 都是从0开始
举个例子
#include <stdio.h>
int main()
{
int arr[3][5]={1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
printf("%d\n",arr[2][4]);//输出结果为7
return 0;
}
二维数组的输入与输出
举个例子
//行的选择范围是0~2,列的选择范围是0~4,就可以借助循环生成所有的下标
#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]);//输入数据
}
}
//输出
for(i=0;i<3;i++)//产生行号
{
int j=0;
for(j=0;j<5;j++)//产生列号
{
printf("%d",arr[i][j]);//输出数据
}
printf("\n");
}
return 0;
}
9.二维数组在内存中的存储
二维数组中每个元素都是连续存放的
10.C99中的变长数组
- 变长数组是用变量指定数组大小
- 变长数组不能初始化
- 但是VS上不支持变长数组
11.数组练习
//多个字符从两端移动,向中间汇聚
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.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);
}
return 0;
}
二分查找
#include <stdio.h>
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int left=0;
int right=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");
}