1.数组的概念
数组是一组相同类型的集合,元素个数不能为0。
2.一维数组的创建和初始化
2.1数组创建
一维数组创建的语法:
1 type arr_name[常量值];
存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型。
type指定的是数组中存放数据的类型,如:char、short、int、float等,也可以是自定义类型。
arr_name指的是数组名。
[ ] 中的常量值是用来指定数组的大小。
2.2数组的初始化
一般使用大括号,将数据放在大括号中。
//完成初始化
int arr[5]={1,2,3,4,5};
//不完全初始化
int arr2[6]={1};//第一个元素初始化为1,剩下元素默认为0
//错误初始化
int arr3[3]={1,2,3,4};
2.3数组的类型
int arr1[10];
int arr2[12];
char ch[5];
arr1数组的类型是int [10]
arr2数组的类型是int [12]
ch数组的类型是char[5]
3.一维数组的使用
3.1数组下标
下标是从0开始,假设数组有10个元素,最后一个元素的下标是9,下标相当于数组元素的编号。
int arr[10]={1,2,3,4,5,6,7,8,9,10};
数组 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
数组的访问提供了一个操作符[ ] ,这个叫:下标引用操作符。
3.2数组元素的打印
想访问整个数组的元素,可以使用for循环产生0~9的下标,再使用下标访问。
如:
#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;
}
4.sizeof计算数组元素个数
#include<stdio.h>
int main()
{
int arr[10]=0;
printf("%d\n",sizeof(arr));
return 0;
}
这里输出的结果是40,计算的是数组所占内存空间的总大小,单位是字节。而数组中元素的类型都是相同的,只要计算一个元素所占字节的个数,数组的元素个数就能算出来。
#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;
}
这里的结果是10,表示数组有10个元素。
5.二维数组的创建
5.1二维数组的概念
把一维数组做为数组的元素,就是二维数组了。
5.2二维数组的创建
语句如下:
type arr_name[常量1][常量2];
例如
int arr[3][5];
double data[2][8];
3表示有3行,5表示每行有5个元素。
6.二维数组的初始化
也是使用大括号初始化的。同样包括完全初始化和不完全初始化。
6.1按行初始化
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}};
省略行,不能省略列
7.二维数组的使用
7.1二维数组的下标
规定行是从0开始,列也是一样。如:
int arr[3][5]={1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
1 | 2 | 3 | 4 | 5 |
2 | 3 | 4 | 5 | 6 |
3 | 4 | 5 | 6 | 7 |
#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]);
return 0;
}
第二行,第四列,很快定位到七。
7.2二维数组的输入和输出
访问单个元素已经知道了,但是要访问整个二维数组呢?
#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;
}
8.数组练习
1.练习:多个字符从两端移动,向中间汇聚。
#include <stdio.h>
int main()
{
char arr1[]="welcome to here...";
char arr2[]="##################";
int left=0;
int right=strlen(arr)-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[]={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=(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");
}
求中间元素的下标,使用mid=(left+right)/2,如果left和right比较大的时候可能存在问题,可以使用下面的方式。
mid=left+(right-left)/2;