导图社区 c第四单元 数组及自定义数据类型
这是一篇关于c第四单元 数组及自定义数据类型的思维导图
编辑于2021-12-19 20:33:28c++第四单元 数组及自定义数据类型
数组
定义
Array:表示具有一定顺序关系且类型相同的若干变量的集合
数组元素
组成数序的变量
用数组名+下标 来标识
e.g. score[1] 为score数组的第二个元素
元素的下标从0开始计
元素的下标从0开始计,数组元素最大下标比元素数少1
元素下标==元素存放位置相对数组名的偏移量
数组第i个元素的起始地址相对数组的起始地址偏移了i个int型变量所占空间
数组名
表示该内存空间的起始地址
地址常量,**不能赋值!
占用空间
元素:每个元素占用空间大小与同类型变量占用的大小相同
数组:数组占用内存空间是其全部元素所占空间的总和
若数组有n个元素,其所占字节数可通过以下方式得到
sizeof(数组名)
n*sizeof(数组类型)
定义的语法形式
一维数组:类型标识符+数组名+常量表达式
e.g. int a[5] = {1,2,3,4,5};
子主题
说明
类型标识符:任何合法的类型标识符,用于说明数组元素的类型
数组名:数组的命名,原则同变量命名
[ ]及常量表达式:说明数组中元素个数
初始化
定义:在定义数组时,直接给出赋给数组元素的值
语法形式:类型标志符 数组名[常量表达式]={以逗号隔开的初始化值}
e.g. int score[5] = {1,2,3,4,5};
初始化列表中的数据依次赋给score[0~4]
若在初始化列表中给定数组元素的全部值,可省略括号中元素个数常量表达式 e.g.2: int score[] ={1,2,3,4,5}; 编译器自动计算出有五个元素并分配存储空间
注意
初始化数组时给定的初始化数值数<=数组元素数;
若给定数值数<数组元素数,初始值从下标0开始依次分配,未得到初始值的元素初始化为0
若使用初始化列表,表内至少要包含一个初始值
若没有初始化列表(只定义不做初始化)一般在函数内部定义的自动局限数组,其各元素的值是随机值,使用时需重新赋值
访问数组元素
语法形式
数组名[下标表达式]
e.g. cin>>score[4];
下标表达式可以是常数、变量、表达式,>0 && <数组大小
注意
下标表达式的结果==0/正整数
下标值不得超过数组声明时所限定的上下界
下界:0
上界:相应维数大小-1
越界访问问题
使用下标不在有效范围的话,会造成“越界访问”错误
编译器不会检查这种错误!
使用面向程序设计 可以定义下标不能越界的数组:c++中vector类
字符数组
定义
char型的数组称为字符数组,通常用来存储字符串
语法形式:char 数组名[常量表达式(可省略)] = “hi o!”;
初始化
1.用双引号内的字符串初始化
e.g. char array[10]={"hello"};
可省略大括号,简化:char array[10]="hello";
**用这种方式初始化时,系统自动在最后一个元素后面补“/0”(结束符)
2.用字符常量来初始化字符数组
e.g. char array[10]={'h','e','l','l','o','/0'};
该方法将初始值一一列举在初始化列表中, 通常用于输入不容易在键盘上生成的不可见字符
此种方式下,编程者要自己添加字符串结束符/0,同时不要忘记给/0留出空间
赋值
1.一个字符一个字符赋值
e.g. char array[10]; array[0]='h';
2.用c的库函数strcpy(字符数组1,字符串2)
e.g. char str1[10]="",str2[]="hello"; strcpy(str1,str2);
或 strcpy(str1,"hello");
**不能用赋值语句将一个字符串常量或字符数组直接给字符数组赋值,str1=“hello”;错!!数组名是地址常量
输入与输出
字符数组的输入是给数组各元素赋值的过程
在循环中通过cin一个个输入 (用for循环,i++)
通过cin整串输入 e.g. a[50]='/0';cin>>a;
调用I/O类成员函数输入 cin.getline(a,50,'/n');
输出
逐元素输出
通过数组名输出
只有字符数组名能用cout输出数组内的数据
除了字符数组,其它类型的数组要输出数组元素的值,必须用循环语句一个元素一个元素的输出,且数组名只能代表数组的存储地址
多维数组
定义
语法形式
二维数组:类型标识符 数组名标识符[常量表达式1][常量表达式2];
三维数组:类型标识符 数组名标识符[常量表达式1][常量表达式2][常量表达式3];
n维数组:类型标识符 数组名标识符[常量表达式1][常量表达式2]......[常量表达式n];
称谓(?
二维数组的下标从左至右称为行、列
三维数组的下标从左至右可称为页/层、行、列
注意
首先根据要表示的对象内容选择合适的数据类型
其次确定数组的堆数(几维数组)
最后确定每一堆的大小(每维内元素数量)
**每一堆的大小必须有常量表达式声明
初始化
初始化值位于大括号内,构成初始值列表,多维数组初始化时需要使用嵌套的括号;
可以省略内层的括号,只要程序好读即可
可以只给出部分值,其余为0;
int a[3][4]... ={0}:这是将多维数组元素置0的最简便方法之一
访问
指定访问数组元素的具体下标值
语法形式
数组名[下标表达式1]...[下标表达式n]
下标表达式个数=数组维数
下标表达式i可以用常量 变量 表达式,(i>=0 && i<i维)
在内存中的映像
一维数组在内存中从数组名所代表的起始地址开始,按下标次序存储; d1的第i个元素在内存中的起始位置相对于数组名地址偏移了i个int型变量空间大小
二维数组在内存中从数组名所代表的起始地址开始,按行优先依次存储;数组d2的第i行j列在.....偏移了 行号×列数+列号 个int型变量空间大小
元素d2[i][j]起始地址计算:&d2[0][0]+(i×3+j)
三维数组在内存中从数组名所代表的起始地址开始,按页、行、列依次存储,即按照数组元素最右边下标值最快的变化来存储
k页i行j列....偏移了 页号×(行数×列数)+行号×列数+列号 个...
d3[k][i][j]起始地址:&d3[0][0][0]+(k×3×2+i×2+j)(d3[2][3][2]
自定义数组类型
枚举类型
定义
定义一种数据类型,一一列举这种数据类型的变量的可能值
声明形式:enum 枚举类型名{枚举元素列表};
可以使用这种自定义数据类型来定义变量
使用
enum weekday{sun, mon, tue, wed=9, thu, fri, sat};
注意
在类型定义之后,枚举元素按常量处理,不能赋值
枚举元素具有默认值,依次为0,1,2....
也可以在类型声明时另行指定枚举元素的值
如上例,赋值之后面的元素在赋值基础上++,thu=10,fri=11
只可以进行关系运算
将整数值赋给枚举变量:强制类型转换 int x=2; weekday day; day=x 错;day=(weekday)x;对
内存空间:按整型对待
结构类型
定义
由各种数据类型(基本数据类型/已声明的自定义数据类型)的数据组成的集合
结构体可以由不同数据类型的成员构成,成员也可能是已声明的另一个结构类型
声明形式:struct 结构类型名{数据类型标识符1 成员名1;...数据类型标识符n 成员名n;};(必须以分号结束定义)
在主函数外声明
使用
访问:结构变量名.成员名
初始化:定义结构变量时直接初始化,分别给各个成员赋值
赋值运算
属于同一结构类型的各个变量之间可以相互赋值
不同结构的变量不允许相互赋值(即使他们可能具有同样的成员)
内存空间
所占的存储空间是结构中所有成员所占空间的总和
系统会将所占空间不是4的**成员空间调整为四的倍数
联合类型
定义
使几个不同类型的变量共用同一组内存单元
声明形式: union 联合类型名{数据类型说明符1 成员名1...n};
联合类型变量定义形式: 联合类型名 联合变量名
引用形式:联合变量名.成员名
可以不声明名称——无名联合,常用做结构类型的内嵌成员
特点
同一段内存用来存放几种不同类型的成员,但同一时刻只存放一种
其中起作用的成员是最后一次存放的成员,存入新成员后,原有的成员就会失去作用
联合变量的地址与其成员相同
不能对联合变量名赋值,也不能在定义时初始化
不能用联合变量作为函数参数或返回值