学习目的
了解数组
了解一维数组
了解二维数组
数组的实际应用
目录
数组的定义
一维数组
一维数组的创建
一维数组的初始化
一维数组的使用
一维数组在内存中的存储
二维数组
二维数组的创建
二维数组的初始化
二维数组的使用
二维数组在内存中的存储
二维数组的视角
数组越界
一维数组的越界
二维数组的越界
数组作为函数参数
数组名
指针
数组的定义
数组是同类型元素的集合。
数组的类型: type [const_n]
一维数组
一维数组的创建
type name [const_n]
含义:向内存申请空间
注意:const_n在不支持C99标注的编译器上只能使用常量,反之可以使用变量(不能初始化,GCC可以支持)
int arr[10]; char arr[10];
一维数组的初始化
含义:创建数组同时赋值
分为完全初始化和不完全初始化,
int arr[5]={1,2,3,4,5} 完全初始化
int arr[5]={1}不完全初始化,未被初始化的部分自动被赋值为0
-----------------
字符数组与字符串
char ch[]={'a','b','c'}完全初始化,内容为a,b,c
char ch[]="abc"完全初始化,内容为a,b,c,
char ch[5]="abc"不完全初始化,内容a,b,c, ,0最后时系统自动
一维数组的使用
下标
下标是数组元素的编号,从0开始,
| 数组 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 数组下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
下标引用操作符[]
对数组的操作,必须使用到数组的下标及下标引用操作符
int main()
{
int arr[10];
int i;//i就是下标
for (i = 0; i < 10; i++)//使用下表对数组赋值
{
arr[i] = i + 1;
}
for (i = 0; i < 10; i++)//打印下标
{
printf("%d ", arr[i]);
}
printf("n");
arr[5] = 999;//使用下标对数组元素赋值
printf("%dn", arr[5]);//使用下标打印数组元素
}
一维数组在内存中的存储
一维数组在内存中的地址是连续的,而且随着下标的递增而增加
| 数组地址 | 0x11 | 0x12 | 0x13 | 0x14 | 0x15 | 0x16 | 0x17 | 0x18 | 0x19 |
| 数组下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
注意:每个元素的地址只是字节的首地址
int main()
{
int arr[10];
int i;//i就是下标
for (i = 0; i < 10; i++)//使用下表对数组赋值
{
arr[i] = i + 1;
}
for (i = 0; i < 10; i++)//打印元素地址
{
printf("%p ", &arr[i]);
}
printf("n");
system("pause");
return 0;
}
二维数组
二维数组的创建
type name [const_n][const_n]
注意:二维数组创建能省略行坐标,但是不能省略列坐标,列坐标决定每一行元素的多少,没有列坐标就无法确定下一行开头元素的地址
二维数组的初始化
int arr[3][3]={1,2,3,4,5,6,7,8,9}
int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}}
int arr[3][3]={1,2,3}
int arr[3][3]={{1},{2},{3}}
二维数组的使用
与一维数组相同,需要嵌套循环
二维数组在内存中的存储
二维数组在内存中的地址是连续的,而且随着下标的递增而增加
| 数组地址 | 0x11 | 0x12 | 0x13 | 0x14 | 0x15 | 0x16 | 0x17 | 0x18 | 0x19 |
| 数组下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
注意:每个元素的地址只是字节的首地址
二维数组的视角
以一维数组的视角来看,内存中数组的地址是连续的,所以可以把一个二维数组看成一维数组
arr[2][5]与arr[10]相同
| 0x11 | 0x12 | 0x13 | 0x14 | 0x15 | 0x16 | 0x17 | 0x18 | 0x19 | 0x20 |
| arr[0][0] | arr[0][1] | arr[0][2] | arr[0][3] | arr[0][4] | arr[1][0] | arr[1][1] | arr[1][2] | arr[1][3] | arr[1][4] |
以列表的角度看,arr[3][3]可以看成三行三列的一个列表
| arr[0][0] | arr[0][1] | arr[0][2] |
| arr[1][0] | arr[1][1] | arr[1][2] |
| arr[2][0] | arr[2][1] | arr[2][2] |
以一维数组的数组的角度看
| arr[0] |
| arr[1] |
| arr[2] |
此时,arr[0]是个一维数组
int main()
{
int arr[3][3];
printf("%dn", sizeof(arr[0]));
system("pause");
return 0;
}
数组越界
一维数组的越界
内存中,数组前后都有其他的空间,超过数组的范围会影响其他的空间
int main()
{
int arr[3] = {1,2,3};//下标是0-2,超过下标的范围,就是越界
printf("%dn", sizeof(arr[6]));
system("pause");
return 0;
}
二维数组的越界
int main()
{
int arr[3][3] = {1,2,3,4,5,6,7,8,9};//下标是0-2,超过下标的范围,就是越界
int i = 0,j=0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
}
printf("n");
}
system("pause");
return 0;
}
数组作为函数参数
数组名
void add(int arr[])
void add(int arr[][const_n])
指针
void add(int *parr)
void add(int arr[]) void add(int arr[][const_n])
指针
void add(int *parr)
注意:数组名是首元素的地址,但是二维数组中,数组名相当于第一行的地址
例外:sizeof(数组名)以及&数组名时,数组名代表整个数组



