数组
数组,就是多个元素的有序“组合”。C和C++语言中的数组:相同大小的内存块组成,即相同类型的数据、 编号从0开始递增、而且这些编号是递增顺序。数组的“容量”是不能改变的。
数组的定义
数组和其他变量一样,需要先定义,再使用。
实例:int a[8]; //定义了一个数组,数组名是“a”,包含8个元素,每个元素是int类型的变量,8个变量是连续存储在内存中的
a[0] = 20; a[1] = 5;
数组的初始化
在定义数组的同时,设置数组内的元素值。
int a[8] = {20, 5, 30, 13, 18};
printf("%d,%d,%d,%d,%d\n", a[0],a[1],a[2],a[3],a[4]);
//或者cout << a[0] << “,” << a[1] << “,” << a[2] << “,” << a[3] << “,” << a[4];
int a[8] = {0}; //把数组的所有元素都初始化为0
int a[8] = {1}; //把a[0]初始化为1,其它值都初始化为0
int b[8] = {1, 5}; //把a[0]初始化为1,a[1]初始化为5,其它值都初始化为0
int a[] = {1,2,5}; //定义数组a, 这个数组包含3个元素!
// 根据“初始化列表”,自动计算数组的容量
/*
高逼格用法(在某些特殊场合使用)
优点:但数组的成员较多时,该方式可读性高
缺点:仅仅C编译器支持,C++编译器中不支持,即C++程序中不能使用。
//每周的锻炼时间:
int exercises[7] = {
[1] = 1, //a[1] = 1
[3] = 2, //a[3] = 2
//没有指定的成员,被初始化为0
};
*/
数组的内元素的访问
通过下标访问对应的元素。特别注意, 数组的第一个元素的下标是0, 而不是1。
另类用法:使用下标的方式访问string字符串
string name = "12345";
//name[i]是string字符串中的第i个字符(char类型)
for (int i=0; i< name.length(); i++)
{
cout << name[i];
}
name[0] = 'L'; //name变成:L2345
cout << endl << name;
数组的越界
数组的越界, 是指下标超出正常的范围!例如:int a[10]; //a[-1] 和 a[10]都是越界!
越界后果:可能导致数据破坏,或其他不可预期的后果!
越界控制:需要程序员自己手动控制,编译器不做任何检查!因为,C/C++语言完全信任程序员!
C风格的字符串详解
C语言字符串的存储、初始化
字符串,是通过“字符数组”(元素类型为char的数组)来存储的!
//demo1
char name[10];
name[0] = '1';
name[1] = '2';
name[2] = '3';
name[3] = '4';
name[4] = 0; //字符串结束符0,就是 '\0'
printf("姓名:%s", name);
name[2] = 0;
printf("姓名:%s", name);
//demo2
char name[10] = "1234"; //相当于char name[10] = {'1', '2', '3', '4', '\0'};
printf("姓名:%s", name);
//demo3
char name[] = "1234"; //相当于:name[5] = "1234"
printf("%d", sizeof(name)); //5
二维数组
二维数组,就是指含有多个数组的数组!如果把一维数组理解为一行数据,那么,二维数组可形象地表示为行列结构。
二维数组的定义:和数组一样,需要先定义,再使用。
int a[5][25]; //定义了一个二维数组,数组名是“a”,包含 5 行 25 列,共 125 元素,每个元素是 int 类型的变量
二维数组的初始化:
int a[3][4]; //二维数组元素的值可能是随机的(全局变量会初始化为 0,局部变量值随机)
方式一 初始化时指定每行的值
int a[3][4]={ //等效于 int a[][4]
{1},//省略掉的会默认置零
{5,6,7},
{9,10,11,12}
};
//注:最外围括号内部的每个括号相当于初始化一行,括号中可以省略某些元素的初始化
方式二 初始化时从头开始,依次序进行
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[3][4]={1}; //只初始化第一个,其他得默认置零
二维数组的访问
如下图表示,左侧表示的是一个大小为 M+1 的一维数组,右侧表示的是一个大小为(M+1)*(N+1)的二维数组。
二维数组的存储方式
一维数组是按顺序存储的,二维数组呢? 同样也是!
二维数组作为函数的参数
切记! 数组作为函数的参数传递,不是单纯的值传递,传递的是数组本身。
数组常见错误总结
数组定义时编译器不能确定数组的大小
int a[3][] ; int a[][4] ; int a[3][]={{1,2},{3,4},{5,6}}
一条原则:仅定义时(无初始化)不能省略,有初始化可以省略高维。
严禁数组越界。数组(无论几维)传参并不是整个数组的复制