目录
1.数组的概念
(1)数组是一组相同类型元素的集合;
(2)数组元素个数不能为0;
(3)数组分为一维数组和多维数组;
2.一维数组的创建和初始化
2.1.数组的创建
(1)基本语法:
type arr_name[常量值];
| |
| |
类型 数组名
//type:数组中存放数据的类型(char、short、int、float、自定义类型)
//arr_name:数组名,可以自定义
//[]中的常量名:用于指定数组的大小
2.2.数组初始化
//完全初始化
int arr1[5]={1,2,3,4,5};
//不完全初始化
int arr2[5]={1};//第1个元素初始化为1,剩下的元素初始化为0
//错误的初始化——初始化项太多
int arr3[3]={1,2,3,4};
//也可以省略掉数组内的小指定,编译器会根据数组的初始化内容确定数组的真实大小
int arr4[]={1,2,3,4,5};
3.一维数组的使用
(1)数组的下标从0开始,第n个元素的下标为n-1;
(2)[]叫做下标引用操作符,只需要将想要找的元素的下标填入其中即可;
(3)想要访问整个数组的内容,利用循环语句产生所有元素的下标即可;
(4)若想要自己输入数组的数据,则可以采用scanf("%d",&arr[i]);的形式;
4.一维数组在内存中的存储
计算机处理的数据,均要加载到内存中处理,内存会被划分为一个个的内存单元(一个内存单元就相当于一个字节),然后给每个内存单元都编上号:编号==地址
#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] = %p\n ", i, &arr[i]);//%p是用于打印地址的
}
return 0;
}
由运行结果可知:随着数组下标的增长,地址由小到大变化,并且每两个相邻元素之间相差为4;
(1)一维数组在内存中是连续存放的;
(2)随着数组下标的增长,地址是由小到大增长的;
5.sizeof计算数组元素个数
(1)sizeof可以用于计算数组中元素的大小:
printf("%d\n",sizeof(arr));//40——计算的是数组总元素的大小,单位是字节
printf("%d\n",sizeof(arr[0]));//4——计算的是数组首元素的大小,单位为字节
(2)sizeof可以计算出数组中元素的个数:
#include<stdio.h>
int main()
{
int arr[10]={0};
int sz=sizeof(arr)/sizeof(arr[0]);//此处结果为10,因为数组中总共有10个元素
//原理:数组元素个数=数组总大小/数组首元素的大小
printf("%d\n",sz);
return 0;
}
6.二维数组的创建和初始化
将一维数组作为数组的元素时得到的就为二维数组,将二维数组作为数组的元素时得到的就为三维数组,二维数组以上的数组统称为多维数组。
6.1.二维数组的创建
type arr_name[常量值1][常量值2]
| |
| |
行 列
int arr[3][5];
//3代表数组有3行;
//5代表数组有5列;
//int代表数组的每个元素为整型类型;
//arr为数组名,可自定义
6.2.二维数组的初始化
//不完全初始化
int arr1[3][5]={1,2};//依次初始化每一行,元素不够的时候就将剩余元素全部初始化为0;
int arr2[3][5]={0};//将所有元素初始化为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}};
7.二维数组的使用
(1)二维数组的行和列下标都是从0开始的,只要确定了一个元素行和列的下标就能锁定住该元素;
(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放此处表示:一次性全部放进去再打印
}
printf("\n");
}
return 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};
int i = 0;//遍历⾏
//输⼊
for(i=0; i<3; i++) //产⽣⾏号
{
int j = 0;
for(j=0; j<5; j++) //产⽣列号
{
scanf("%d", &arr[i][j]); //输⼊数据
printf("%d ", arr[i][j])
//printf放此次表示:输入一个则打印一个
}
}
//输出
for(i=0; i<3; i++) //产⽣⾏号
{
int j = 0;
for(j=0; j<5; j++) //产⽣列号
{
;
}
printf("\n");
}
return 0;
}
8.二维数组在内存中的存储
#include <stdio.h>
int main()
{
int arr[3][5] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
由运行结果可知:
(1)二维数组中的每个元素是连续存放的;
(2)二维数组是一个存放一维数组的数组,二维数组的每个元素都为一维数组;
9.C99中的变长数组
(1)变长数组不能初始化;
(2) gcc编译器支持变长数组;
练习:
//多个字符从两端移动,向中间汇聚
#include<string.h>
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
char arr1[] = "welcome to my world!";
char arr2[] = "####################";
int left = 0;
//int right = strlen(arr1)-1;//下标=长度-1
int sz = sizeof(arr1) / sizeof(arr1[0]);
int right = sz - 2;//减去1个\0;减去1个数为下标
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
Sleep(1000);//睡眠1000毫秒,可以减缓程序运行的速度
system("cls");//system函数为库函数,执行系统命令;cls清理控制台屏幕信息
left++;
right--;
}
printf("%s\n", arr2);
return 0;
}
//折半查找(二分查找)
//一次折半过程:
//1.确定被查找的范围;
//2.确定被查找范围的左右下标;
//3.根据左右下标确定中间元素的下标;
//4.1>找到了,就结束;
//4.2>没找到,根据大小关系确定新的折半范围
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//有序的情况下才可使用折半查找
int k = 0;
scanf("%d",&k);
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
int flag = 0;
int mid = (left + right) / 2;
while (left <= right)
{
if (arr[mid] == k)
{
printf("找到了,下标是:%d\n", mid);
flag = 1;
break;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
if (left > right)
{
printf("找不到\n");
}
}
return 0;
}