概述:
所谓数组,就是一个集合,里面存放相同类型的数据元素
特点:
数组中的每个元素都是相同的数据类型
数组是由连续的内存位置组成的
一、一维数组
1、三种定义方式:
数据类型 数组名[元素个数]数据类型 数据名[元素个数]={值1,值2,值3,。。。。};数据类型 数据名[ ]={值1,值2,值3,。。。。};
#include
#include
void test() {
//定义方式一
//数据类型 数组名[元素个数]
int score[10]; //数组名为score,数组中最多是10个元素,数据类型是int
//给数组中元素赋值
//利用下标,从0开始计算
score[0] = 100;
score[1] = 90;
score[2] = 80;
//score[10] = 100; //error--下标访问越界
printf("%d\n",score[0]);
printf("%d\n", score[1]);
printf("%d\n", score[2]);
//定义方式二
//数据类型 数据名[元素个数]={值1,值2,值3,。。。。};
//int score2[10] = {1,2,3,4,5,6,7,8,9,10};
//部分初始化数组
int score2[10] = { 1,2,3,4 }; //不足10个数据,其余位置用0填充
//int score2[10] = {[0]=10,[5]=50,[7]=70};//很少使用,了解就好
for ( int i = 0; i < 10; i++)
{
printf("%d\n",score2[i]);
}
//定义方式三 与方式二的区别--方式三没有说 元素个数
//数据类型 数据名[]={值1,值2,值3,。。。。};
int score2[] = {1,2,3,4,5,6,7,8,9,10};//可以省略元素个数,但是一定要说明值是说明
}
int main() {
test();
system("pause");
return 0;
}
2、一维数组名称的作用
可以统计整个数组在内存中的长度可以获取数组在内存中的首地址
#include
#include
void test1() {
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//1.统计整个数组占用内存的大小
printf("sizeof arr = %d\n",sizeof(arr));
printf("每个数据占用空间大小 = %d\n", sizeof(arr[0]));
printf("数组中元素的个数 = %d\n", sizeof(arr) / sizeof(arr[0]));
//2.通过数组的名称,可以取得数组的首地址
printf("数组的首地址为 = %d\n", arr); // %p--用十六进制显示地址 %d--用十进制显示地址
printf("第一个元素的地址为 = %d\n", &arr[0]);
printf("第二个元素的地址为 = %d\n", &arr[1]);
printf("第三个元素的首地址为 = %d\n", &arr[2]);
//数组名是常量,不可以赋值
//arr = 100; //error 不可以给数组名赋值
}
int main() {
test1();
system("pause");
return 0;
}
3、冒泡排序
作用:常用的排序算法,对数组内元素进行排序。
1.对比相邻的元素,如果第一个比第二个大,就交换它们两个
2.对每对相邻元素做相同的动作,执行完毕后,找到第一个最大值
3.重复以上步骤,每次比较次数-1,直到不需要比较
#include
#include
//冒泡排序
//将数组{4,2,8,0,5,7,1,3,9}按照升序排序
void test2() {
int arr[9] = { 4,2,8,0,5,7,1,3,9 };
//外层循环
for (int i = 0; i < sizeof(arr) / sizeof(int)-1; i++) //对比轮数
{
//内层循环
for (int j = 0; j < sizeof(arr) / sizeof(int)-1-1; j++) //对比次数
{//对比相邻的元素,如果第一个比第二个大,就交换它们两个
if (arr[j]>arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0; i < sizeof(arr)/sizeof(int); i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main() {
test2();
system("pause");
return 0;
}
运行结果:
二、二维数组
1.定义方式
数据类型 数组名 [行数] [列数];数据类型 数组名 [行数] [列数] = { {数据1,数据2} , {数据3,数据4}.......}; 推荐!!!!数据类型 数组名 [行数] [列数] = { 数据1,数据2,数据3,数据4.......};数据类型 数组名 [ ] [列数] = { 数据1,数据2,数据3,数据4.......};
#include
#include
//二维数组
void test() {
//方式一:数据类型 数组名 [行数] [列数];
int arr[2][3];
arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
arr[1][2] = 6;
//通过循环输出
for (int i = 0; i < 2; i++) //行
{
for (int j = 0; j < 3; j++) { //列
printf("%d ",arr[i][j]);
}
printf("\n");
}
//方式二:数据类型 数组名 [行数] [列数] = { {数据1,数据2} , {数据3,数据4}.......};
int arr2[2][3] = { {1,2,3},
{4,5,6} };
//方式三:数据类型 数组名 [行数] [列数] = { 数据1,数据2,数据3,数据4.......};
int arr3[2][3] = {1,2,3,4,5,6};//二维数组的本质是一维数组,人为的加了一个维度,地址是连续的
//方式四:数据类型 数组名 [ ] [列数] = { 数据1,数据2,数据3,数据4.......};
int arr3[ ][3] = { 1,2,3,4,5,6 };
}
int main() {
test();
system("pause");
return 0;
}
2、二维数组的名称
查看二维数组所占内存获取二维数组首地址
#include
#include
//二维数组名称
void test1() {
int arr[2][3] = { {1,2,3},
{4,5,6} };
//查看二维数组所占内存
printf("二维数组所占内存为:%d\n",sizeof(arr));
printf("二维数组每行所占内存为:%d\n", sizeof(arr[0]));
printf("二维数组每个元素所占内存为:%d\n", sizeof(arr[0][0]));
//获取二维数组的行列数
printf("二维数组的行数为:%d\n",sizeof(arr)/sizeof(arr[0]));
printf("二维数组的列数为:%d\n", sizeof(arr[0]) / sizeof(arr[0][0]));
//获取二维数组首地址
printf("二维数组的首地址是:%d\n",arr);
printf("二维数组第一行的地址是:%d\n", arr[0]);
printf("二维数组第一个元素的首地址是:%d\n", &arr[0][0]);
printf("二维数组第二个元素的首地址是:%d\n", &arr[0][1]);
}
int main() {
//test();
test1();
system("pause");
return 0;
}
三、字符数组
1、数组的定义方式以及初始化
#include
#include
//字符数组的定义方式
void test() {
char ch[5]; //声明一个字符数组,一共五个元素,每个元素都是char类型
printf("%d\n",sizeof(ch));
}
//数组初始化
void test1() {
//逐个初始化
//char arr[5] = {"h","e","l","l","o"}; //error--没有\0的位置,因此输出的时候会有乱码
//char arr[6] = { "h","e","l","l","o" }; // \0的本质就是 0
//遍历字符数组
char arr[6] = "hello";
printf("%s\n",arr);
}
int main() {
//test();
test1();
system("pause");
return 0;
}
2、字符串长度统计
字符串统计函数:strlen()
头文件:#include
#include
#include
#include
//字符串长度统计
void test2() {
char arr1[25] = "hello word!";
printf("这个字符串的长度是:%d\n",strlen(arr1)); //strlen在统计的时候,不统计\n,只统计有效字符
printf("这个字符串的长度是:%d\n", sizeof(arr1)); //sizeof统计整个数组所占的内存大小
char arr2[ ] = "hello word!";
printf("这个字符串的长度是:%d\n", strlen(arr2));//11
printf("这个字符串的长度是:%d\n", sizeof(arr2));//12
char arr3[] = "hello \0word!";
printf("这个字符串的长度是:%d\n", strlen(arr3));//6 strlen遇到/0,结束统计,并且不统计/0
printf("这个字符串的长度是:%d\n", sizeof(arr3));//13
}
int main() {
//test();
//test1();
test2();
system("pause");
return 0;
}
3、字符数组常用的输入输出
输入
#include
#include
#include
//字符数组输入
void test3() {
//创建字符数组,且初始化为空
char arr3[16] = " ";
//char arr3[16] = { 0 }; //效果一样的,都是初始化数组
scanf("%s",arr3); //遇到空格会结束输入
printf("%s\n",arr3);
strcpy(arr3,"hello word");
printf("%s\n",arr3); //需要包含头文件--#include
}
//gets 不推荐
void test4() {
char arr4[16] = " ";
gets(arr4); // 遇到换行符(回车)才结束,可以输入空格
//不会监测数据是否溢出。一旦数据溢出,程序终止
printf("%s\n",arr4);
}
//fgets 推荐
void test5() {
char arr5[16] = " ";
fgets(arr5,sizeof(arr5),stdin); // stdin--标准输入设备(默认是键盘)
printf("%s\n", arr5);
}
//
int main() {
//test3();
//test4();
test5();
system("pause");
return 0;
输出
#include
#include
#include
//输出 puts fputs
void test6() {
char arr6[16] = "hello word!";
printf("%s\n", arr6);//常用
//自带换行
puts(arr6);
fputs(arr6,stdout); //stdout--代表标准输出设备(默认屏幕),不带换行
}
int main() {
test6();
system("pause");
return 0;
}