数组:多维数组本质和字符数组语法
初学c语言,记录一下学习过程。
数组概括
引入数组的原因:* 要声明很多变量* 程序冗长* 可扩展性差*
- 数组:同一类型数据的集合,用数组名标识
- 元素:数组的基本单元,用数组名和下标确定
数组名表示内存首地址,是地址常量;
编译时分配连续内存;
**数组定义(在定义期间无论名字和下标)**必须用常量表达式,地址是确定的,分配的内存也是确定的;在分配好内存以后,下标可以是变量(该变量需要在范围内);
数组必须先定义,后使用;
只能逐个引用数组元素,不能一次引用整个数组;
int a[5];
a[4]=10;
可以没初始化数组就对其中的一个元素赋值;但不能a[5]=10,这样就越界了。
******排序的应用实例(待补充)
多维数组
多维数组本质是一维数组的原因是内存是一维的。
任意维度数组最左边的是元素的个数【对于多维数组,元素并不是不可以分割的,每一个元素又是一个一维数组】
###多维数组类似于把集合分成好几个大类,再在大类的基础下分成好几个小类,有几维就说明有几层。
对于二维数组而言:行序优先,意味着行是最外层的分类。
将多维数组映射到一维上来,类似于完全展开最小的一层分类,即集合里的全部展开,然后将几个小部分一层一层的扩起来。
int a[M][N];二维数组的本质是包含M个“元素”一维数组,其中的“元素”包含N个一维数组,因此二维数组就是包含一维数组的一维数组。
二维数组的初始化
int a[2][3]={{1,2,3},{1,2,3}}; int a[2][3]={1,2,3,1,2,3};
(二维数组的初始化可以省略第一维的数字,但是不能省略第二维的数字)
二重for循环完美代表二维数组,外层for循环映射行,内层for循环映射列
(初始化应该=0赋值,因为不能确定第一个是否为最大值,若是,则不继续赋值)max选择需要赋初始值
字符数组和字符串
字符数组
字符数组是存储字符类型多个字符类型的结合,字符串是有多个字符组成的集合,
字符数组的初始化
逐个字符的赋值
**char ch[5]={‘h’,‘e’,‘l’,‘l’,‘o’};
‘a’代表字符,“ab”代表字符串。
整体字符串
char ch[6]={“Hello”};
char ch[6]=“Hello”;
char ch[]=“Hello”;
作为“abc”输入时,系统认定他为一个字符串所以自动加了一个’\0’,所以说应该在定义数组的时候留下位置
而作为‘a’输入时,系统没有把它作为一个字符串,故不用预留‘\0’的位置。
一个字符串的长度是不固定的,所以应该有结束符来告知系统他的长度。
二维数组表示多个字符串,长度不一样,所以[][]的最后一个长度要是最长的一个+1————但是容易造成内存浪费:表示多个字符串,除了二维数组之外可以用多个字符指针,在数组里面存指针;