经过近一个月的学习,现本人对数组有一定的理解与看法,下面进行对数组的总结。
数组的创建分两步,第一步是定义一个数组类型的变量;第二步是初始化数组。需要知道的是数组的定义是一组具有相同类型的变量的集合。
数组包含数组名和数组的下标,数组的每个数据项叫做属于元素。
数组的使用方法为:①(一维数组)数组类型 数组名[下标]
②(二维数组)数组类型 数组名[下标1][下标2]。
一维数组指的是一串数据,也可以认为是一组元素;二维数组指的是一个坐标系、也可以认为是一个有两种元素的表格。
在此需要明确的是:①元素在数组中定义的时候,数组名代表数组首地址,一定是个常量!
②数组在c与c++中,下标都是从0开始的。
③为数组进行初始化的字符串是可写的。
④数组定义完成后,其范围大小不能改变,因此在定义数组的时候,尽量要放大范围定义,以防止下标越界。
⑤不要认为数组元素a[i]代表数组元素的值,它代表是数组元素本身。
⑥cout输出时遇到’\0’时就不再输出。
对于一维数组a[3]={1,2,3};
①&a[0]; //取数组第一个元素的地址。
②a; //数据名不是数组的地址,是数组第一个元素的常量地址,与&string[0]等价。
③&a; //这个才是数组的地址。
一维数组声明:值的类型(不能使引用)、数组名和元素数(用值大于1的常量表达式定义)
int& a[10];//错误,没有引用数组。
int a[6] = { 0,1,2,3,4,5 };
int (&p)[6] = a;//p是数组a的引用。
2、数组元素初始化时,若没有显式提供元素初值,则元素会被像普通变量一样初始化:
1)函数体外定义的内置类型数组,元素初始化为0;
2)函数体内定义的内置类型数组,元素无初始化(若只初始化部分元素,其后的元素此时也会被初始化为0);
3)如果不是内置类型,则不管其在哪定义,自动调用其默认构造函数为其初始化,若该类无默认构造函数则会报错。
3、数组大小未知时,需要动态声明一维数组:
int* a = new int[2];
delete[]a;//数组使用完毕时要释放内存空间。
4、C风格字符串:末尾必须有一个字符’\0’。
1)字符串常量,以双引号括起,编译器自动在末尾添加一个空字符 。
2)末尾添加了’\0’的字符数组。
5、字符数组:既可以用一组由括号括起来、逗号隔开的字符常量进行初始化,也可以用一个常量字符串(末尾有空字符)进行初始化 。
注意:在使用处理C风格字符串的标准库函数时,牢记参数必须以结束符NULL结束;
对于二维数组a[2][3]={1,2,3,4,5,6};首先说明的是C++语言中并没有多维数组,通常所说的多维数组其实就是数组里面的元素的内容还是数组。
①&a[0]; //取数组第一个元素的地址,也就是第一个内层数组的地址。
②a; //数据名是第一个内层数组的指针。
③&a; //这个是整个二维数组的地址。
C++规定,在声明和初始化一个二维数组时,如果对二维数组的所有元素都赋值,则第一维(行数)可以省略;
①在C/C++中,二维数组按照行优先顺序连续存储,即先将第一行按顺序存储,再对第二行顺序存储;
②一个二维数组元素a[x][y]在一维数组b中,是a[x][y]=b[x*列数+y];
③二维数组的动态声明:
产生一个二维数组a[m][n]
int m = 5,n=3;
int **a = new int* [m];
for (int i = 0; i < m; i++)
{
a[i] = new int [n];
}
只能用a[i][j]或者((a+i)+j)来访问数组的元素;
动态声明的数组,使用后需要释放内存
数组在定义的一开始可直接赋值,数组定义后没有进行初始化的数组系统会默认其中的元素为随机数,因此最好一开始就对数组中的元素进行定义。数组的赋值需要用循环语句,其中的元素在运算的过程中不可以进行赋值。需要注意的是,若输入不合法,则会数组跳出循环。
对字符数组的一点心得:
①char数组二维时可看作是字符串数组,即多个字符串;
②末尾有一个空字符\0(NULL,ASCII码为0)表示存放的字符串结尾(在用gets或scanf输入字符串时自动在字符串末尾添加,占用一个字符位),如果用scanf的%s或gets输入字符串(如用getchar),结尾一定要加入\0,否则printf和puts输出会出现乱码。
③分别赋值:char str[15] = {'a',.....,};
④直接赋值(仅限初始化):char str[15] = “bad story”;
⑤scanf输入:%c 能够识别空格跟换行并将其输入
⑥%s 通过空格跟换行来识别一个字符串的结束,(输入时数组名前不需要取地址符
⑦getchar()/putchar():单个字符的输入输出。
⑧gets()/puts(): 用来输入/出一行字符串,gets识别换行符\n作为输入结束,如果用scanf输入完后使用gets,要使用getchat()吸收掉换行符后再使用gets。