数组的概念和定义
什么是数组
数组,就是多个元素的有序“组合”。
生活中的“数组”:
- 由多个大小相同的小柜子组成
- 这些小柜子,有自己对应的编号。
- 而且这些编号是递增顺序。
C和C++语言中的数组:
- 由多个大小相同的小柜子组成 => 相同大小的内存块组成,即相同类型的数据
- 这些小柜子,有自己对应的编号 => 编号从0开始递增
- 而且这些编号是递增顺序。
数组的“容量”是不能改变的。
数组的定义
数组和其他变量一样,需要先定义,再使用。
实例:
int a[8];
//定义了一个数组,
//数组名是“a”,
//包含8个元素,
//每个元素是int类型的变量
a[0] = 20;
a[1] = 5;
说明:
定义了如下数组:
int a[8];
就相当于定义了8个int类型的变量
而且这8个变量是连续存储在内存中的。(8个依次相连的邻居)
实例:
某渣男,想要记录他10个女友的身高,可以定义如下:
float girlFirends[8];
girlFirends[5] = 1.78;
int ages[50];
ages[0] = 18;
ages[49] = 19;
数组的初始化
在定义数组的同时,设置数组内的元素值。
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
printf("%d,%d,%d,%d,%d\n", a[0],a[1],a[2],a[3],a[4]);
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 };
常见错误
int a[2] = {1,2,5}; //错误!初始值太多,大于数组的容量
int a[3];
a = {1, 2, 3}; //不能对数组名直接赋值!
int a[3];
a[3] = 10; //下标越界!下标的取值范围是 0, 1, 2
数组元素的访问
数组的内元素的访问
通过下标访问对应的元素。
特别注意, 数组的第一个元素的下标是0, 而不是1
int girlSize[10];
a[5] = 38;
printf(“%d\n”, a[5]);
cout << a[5];
另类用法:
使用下标的方式访问string字符串
string name = "Rock"; //name[i]是string字符串中的第i个字符(char类型) for (int i=0; i< name.length(); i++) { cout << name[i]; } name[0] = 'L'; //name变成:Lock cout << endl << name;
数组的越界
数组的越界, 是指下标超出正常的范围!
例如:
int a[10]; //a[-1] 和 a[10]都是越界!
越界的后果
越界非常危险,可能导致数据破坏,或其他不可预期的后果!
越界的控制
需要程序员自己手动控制,编译器不做任何检查!因为,C/C++语言完全信任程序员!
C语言字符串的存储、初始化
字符串,是通过“字符数组”(元素类型为char的数组)来存储的!
demo1
char name[10]; name[0] = 'L'; name[1] = 'o'; name[2] = 'c'; name[3] = 'H'; name[4] = 0; //字符串结束符0,就是 '\0' printf("姓名:%s", name); //LocH name[2] = 0; printf("姓名:%s", name); //Lo
demo2
char name[10] = "LocH"; //相当于char name[10] = {'L', 'o', 'c', 'H', '\0'}; printf("姓名:%s", name);
demo3
char name[] = "LocH"; //相当于:name[5] = "LocH" printf("%d", sizeof(name)); //5
C语言字符串的输入输出
#include <stdio.h> #include <Windows.h> int main(void) { char name[16]; char addr[64]; printf("姑娘芳名?\n"); scanf("%s", name); //此时输入缓冲区中还有一个回车符 //清空输入缓冲区 fflush(stdin); printf("姑娘家住何地?\n"); gets(addr); //读一行,包括一行中的空格 printf("家住%s 的%s, 我中意你!\n", addr, name); system("pause"); return 0; }