数组
1.为什么需要数组
了解决大量同类型数据的存储和使用问题
为了模拟现实世界
2.数组的分类
一维数组
怎样定义一维数组
个变量连续分配存储壁间
所有的变量数据类型必须相同
所有变量所占的字节大小必须相等
例子:
int a[5];
维数组名不代表数组中所有的元素,
维数组名代表数组第 个元素的地址
当我们定义一个数组a 时,编译器根据指定的元素个数和元素的
类型分配确定大小(元素类型大小*元素个数)的一块内存,并
把这块内存的名字命名为a。名字a 一旦与这块内存匹配就不能
被改变。a[0] a[1]等为a 的元素,但并非元素的名字。数组的每
一个元素都是没有名字的。
有关一维数组的操作
初始化
字符数组的初始化:
char word[] = {'a', 'b', 'c'};
字符串数组的初始化:
方式一:char word[] = {"abc"};
方式二:char word[] = "abc";
完全初始化int a[5] = {1, 2, 3, 4, 5} ;
不完全初始化,未被初始化的元素自动为0
int a[5] = {1, 2, 3};
不初始化,所有元素是垃圾值
int a[5];
清零
int a[5]= {0};
错误写法
int a [5];
a[5]= {1, 2, 3, 4, 5} ; / /错误
只有在定义数组的同 才可以整体赋值,
其他情况下整体赋值都是错误的
a[5]只是元素,并不是这个 元素名,数组的每个元素 都是没有名字的。而且int a[5] 并没有元素a[5]其最大 为a[4]。
int a [ 5 ]= {1, 2, 3, 4, 5} ;
a [ 5 ]= 100 ; //error 困为没有a[5 ]这个元素,最大具有 a[4]
int a [5 ] = {1, 2, 3, 4, 5} ;
int b [ 5 ] ;
如果要把 中的值全部复制给 数组
错误的 写法
b = a; / / error
正确的写法
for (i=0; i < 5 ; ++i)
b [i] = a [i];
数组常遇见的问题
赋值
排序
求最大/小值
倒置
查找
插入
删除
二维数组
int a [3] [4] ;
总共是12个元素,可以当做 待,这12个元素的名字依次是
a [0] [0] a [0] [IJ a [0] [2] a [0] [3]
a [I ] [0] a [I] [I] a [I] [2] a [I] [3]
a [2] [0] a [2] [I] a [2] [2] a [2] [3]
a [i ] 表示第i+1行第j+1 列的元素
int a[m] [n] 该二维数组 角位 的元素只能 是[m- 1] [n- l]
初始化
int a[3]
[4]
=
{1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
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
,
2
,
3
,
4}
,
{ 5
,
6
,
7
,
8}
,
{9
,
10
,
11
,
12} ;
int
i
,
j;
//输出数组内容
for (i=O; i<3; ++i)
{
for (j=O; j<4; ++j)
printf( "%d ",a[ i ] [ j ] ) ;
printf("\n");
}
二维数组3行4列输出
int a[3][4] = { {1, 2, 3, 4},
{1, 2, 3, 4},
{1, 2, 3, 4}};
int i, j;
for(i=0; i<3; i++)
{
for(j=0; j<4; j++)
{
printf("a[%d][%d] = %d ", i, j, a[i][j]);//每四个一行
}
printf("\n");//换行
}
对二维数组排序
求每一行的最大值
判断矩阵是否对称
矩阵的相乘
多维数组
是否存在多维数组
不存在
因为内存是线性一维的
维数组可以当做每个元素是n-1 维数组的 维数组
比如:
int a[3] [4];
该数组是含有 3个元素的一维数组
只不过每个元素都可以再分成 4个小元素
int a [3][4][5];
该数组是含有 个元素的一维数组
只不过每个元素都是 列的 维数组