一、数组
- 概念:数据构造数据类型中的一种,是一个或多个相同的基本数据类型连续存储而构成的一种自定义类型。
- 数组的定义:使用数组的目的是将相同数据类型的数据连续存储以方便使用。
- 元素:指数组中的每一个数据的统称。在数组中,元素是有编号的,编号是从0开始的。同一个数组中,各个元素类型是一致的。
- 数组的初始化:本质是对数组中的每个元素赋初始值。
- 在定义时赋初始值:元素数据类型 数组变量名[元素个数] = {数据列表}
注意事项:数据列表中,各个元素的初始值一一对应,类型一致,各个数据列表中,数据个数,少于数组元素个数,则前面的数据一一对应初始化,后续的元素,使用0初始化。
memset();//头文件<string.h>
memset(内存起始地址,0,内存长度单位字节);
-
数组定义后,初始化只能通过数组引用对每个元素进行初始化,不能直接使用“数组名 = {数据列表}”的形式进行赋初值;可以通过循环进行赋值。
-
关于数组定义时元素个数缺省的问题:只有在定义时初始化过程中有数据列表存在,数组的元素个数由实际的数据列表中的数据个数决定。
- 数组元素的引用(读写):操作数组中的元素。
//表达式结果即代表该元素,元素下标,可以是表达式的值,但必须是正整数
数组名[元素下标];
例如:张三同学的语数外理化生成绩如下:90、88、65、98、89、77
//元素数据类型 数组变量名[元素个数]
//定义数组
int grades[6];
//数组初始化
grades[6] = {90,88,65,98,89,77};
- 数组名的本质:即呆滞数组存储的首地址。
- 数组的存储模型:
- 数组内存分配:在程序编译时,数组的内存空间就应该已经确定。
- 数组的遍历:使用循环。
- 计算数组元素的个数:sizeof(数组名)/sizeof(数组名[0])
练习:写一个程序录入张三的成绩:90、88、65、98、89、77,使用数组存储,找出张三最好的成绩及在数组中的元素下标。
#include <stdio.h>
int main()
{
int grades[6];
printf("请输入成绩:");
for(int i = 0; i < sizeof(grades)/sizeof(grades[0]); i++)
{
scanf("%d",&grades[i]);
if(i == 5)
{
break;
}
}
int maxgrades = grades[0],maxgrades_index = 0;
for(int i = 1; i < sizeof(grades)/sizeof(grades[0]); i++)
{
if(maxgrades < grades[i])
{
maxgrades = grades[i];
maxgrades_index = i;
}
}
printf("maxgrades = %d,index = %d\n",maxgrades,maxgrades_index);
return 0;
}
- 数组的排序问题:
- 选择排序:将符合排列要求的依次选择出来,排在前面。
//选择排序 #include <stdio.h>
int main()
{
int arry[6] = {90,88,65,98,89,77};
for(int i = 0; i < sizeof(arry)/sizeof(arry[0]); i++)
{
int max = arry[i],index = i;
for(int j = i+1; j <= sizeof(arry)/sizeof(arry[0])-1; j++)
{
if(max < arry[j])
{
max = arry[j];
index = j;
}
}
if(max != arry[i])
{
arry[index] = arry[i];
arry[i] = max;
}
}
for(int i = 0; i < sizeof(arry)/sizeof(arry[0]); i++)
{
printf("%d ",arry[i]);
if(i == sizeof(arry)/sizeof(arry[0])-1)
{
printf("\n");
}
}
return 0;
}
- 冒泡排序:每排列一次,将最符合排列要求的数排列出来。
//冒泡排序
#include <stdio.h>
int main()
{
int arry[] = {90,88,65,98,89,77};
for(int i = 0; i < sizeof(arry)/sizeof(arry[0])-1; i++)
{
int flag = 0;
for(int j = 1; j < sizeof(arry)/sizeof(arry[0])-i; j++)
{
if(arry[j-1] < arry[j])
{
int tmp = arry[j];
arry[j] = arry[j-1];
arry[j-1] = tmp;
flag = 1;
}
}
if(flag == 0)
{
break;
}
}
for(int i = 0; i < sizeof(arry)/sizeof(arry[0]); i++)
{
printf("%d ",arry[i]);
if(i == sizeof(arry)/sizeof(arry[0])-1)
{
printf("\n");
}
}
return 0;
}
二、字符串
- 字符串:由1个或多个字符连续存放,并且字符以’\0’结束。
- 字符数组:存放的元素是一个一个的字符,称为字符数组。
注意事项:字符数组不是字符串,没有结束符,所有依赖于结束符的操作都会出问题,如:printf()、%s。
- 字符串数组:一个数组中存放的元素是一个一个的字符,其结尾有’\0’元素,称为字符数串组。通常称字符串数组也叫字符串或字符串变量。访问没一个字符,按数组操作即可。
三、二维数组与多维数组
(一)二维数组
- 二维数组:数组中的元素是数组类型。
- 二维数组的定义:
//一维数组的定义
元素数据类型 数组变量名[元素个数];
//数组的类型:除去变量名,剩余的即其类型
//定义一个有3个元素的数组,其元素是int [2]类型,即数组中的元素是一个有2个整型元素的一
元素数据类型 数组变量名 [元素个数];
int a[3][2];
//逻辑结构
a <==> {{int,int},{int,int},{int,int}}
-
内存分布——存储结构:是在内存中连续存储。
-
二维数组的初始化:二维数组是一种特殊的数组;属于数组的一种;初始化规则与数组一致。
- 定义时初始化:
int a[3][2] = {{1,2},{3,4},{5,6}};
- 二维数组的应用场景:一维数组对应的是一条线,二维数组对应的是一个平面。
- 学生成绩:
姓名 | 语文 | 数学 | 外语 |
---|---|---|---|
张三 | 90 | 88 | 79 |
李四 | 88 | 99 | 79 |
#include <stdio.h>
int main()
{
int grades[2][3] = {{90,88,79},{88,99,79}};
//打印李四的成绩
// printf("%d\n",sizeof(grades[0])/sizeof(grades[0][0]));
printf("李四的成绩:");
for(int i = 0; i < sizeof(grades[0]) / sizeof(grades[0][0]); i++)
{
printf("%d ",grades[1][i]);
}
//打印所有成绩
printf("\n所有成绩:");
for(int i = 0; i < sizeof(grades) / sizeof(grades[0]); i++)
{
for(int j = 0; j < sizeof(grades[0]) / sizeof(grades[0][0]); j++)
{
printf("%d ",grades[i][j]);
}
}
printf("\n");
return 0;
}
- 二维数组的元素引用:与一维数组的元素引用一致。
- 二维字符数组:见过个字符串放入到数组中存储,即构成了二维字符数组。