第三章 数组
数组的特点:
1.为n个变量连续分配存储空间,即数组必为连续分配。
2.所有的变量数据类型必须相同。
3.所有变量所占的字节大小必须相等。
int a[5]; //a为数组名,表示a[0]的地址。所以不能出现 a = b这样的赋值写法(a、b均为数组名)。
数组中的元素用a[下标]表示,数组中有下标是因为数组中的元素是连续的。
数组名[下标]之所以能够表示元素,是因为a[i]完全等价于*(a+i)。
a[i]也可以写作[i]a
inta[5] = {1,2,3,4,5};
a[1]= 18;
3[a]= 20; //因为数组名a[3]等价于*(a+3)等价于*(3+a),所以a[3]等价于3[a]。
数组的初始化:
完全初始化:
inta[5] = {1, 2, 3, 4, 5};
不完全初始化,未被初始化的值将自动为零:
inta[5] = {1, 2, 3};
不初始化,所有元素的值是垃圾值:
inta[5];
清零,利用不完全初始化的性质:
inta[5] = {0}; //a[0]将被赋值为0,其他的将自动归零。
注意!错误写法:
inta[5]; //此处a[5]中的5表示数组中元素个数,只有在定义时此处数字才表示个数。
a[5]= {1,2,3,4,5} //此处a[5]表示一个元素,且数组中没有a[5]这个元素,5表示数组下标5。
只有在定义数组的同时才可以整体赋值,其他情况下整体赋值都是错误的。
数组的其他操作:赋值、排序、求最大/最小值、倒置、查找、插入、删除等。
将数组中的元素倒序
int a[7] = {1, 2, 3, 4, 5, 6, 7};
inti, j, t;
i= 0;
j= 6;
while(i < j) //i,j分别是数组元素的首下标和尾下标
{
t= a[i];
a[i]= a[j];
a[j]= t;
++i; //元素互换后,i和j分别自增自减
--j;
}
/*
for(i=0, j=6; i
{
t= a[i];
a[i]= a[j];
a[j]= t;
}
*/
一维数组的定义:int a[5]; //a为数组名,5表示数组a中有5个元素。(注意:此处数组个数定义与VB中的数组个数定义不同。)
多维数组的定义:int a[8][6][x][y]...;
如:int a[8][6];二维数组,有8行6列,共48个元素。相当于矩阵。其名称也从a[0][0]到a[7][5]
多维数组的初始化:
inta[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
inta[3][4] = {
{1,2, 3, 4},
{5,6, 7, 8},
{9,10, 11, 12}
}; //推荐这样写,比较整齐。
输出多维数组内容,需要多重循环嵌套使用:
inti, j;
for(i=0; i<3; i++)
{
for(j=0; j<4; j++)
printf("%-4d",a[i][j]); //对输出格式的控制:%-4d中,负号表示左对齐,4表示每个元素占4个字
printf("\n"); //输出换行符 节。
}
多维数组的应用:
对二维数组排序;
求第一行的最大/最小值;
判断矩阵是否对称;
矩阵的相乘等。
问题:是否存在多维数组?
不存在!
因为内存是线性一维的。
n维数组是看作每个元素都是n-1维数组的一维数组,
n-1维数组又可以看作每个元素都是n-2维数组的一维数组,依次类推,即n维数组全被看作是一维数组的集合。
如:
inta[3][4][5];
该数组是含有3个元素的一维数组,
只不过每个元素都是4行5列的二维数组。
数组的赋值与输出:
注:因为数组中的元素比较多,所以数组的赋值与输出经常与循环结合使用。
# include
int main(void)
{
inta[5] = {1, 2, 3, 4, 5}; //数组名a后跟中括号[],赋值用大括号{},并以逗号隔开。5表示数组a中有5个元素,
inti; //其分别用a[0], a[1], a[2], a[3], a[4]表示。注意第一个元素从0开始!
for(i=0; i<5; ++i)
{
printf("a[%d]= %d\n", i, a[i]);
}
return0;
}
/*
输出结果:
a[0]= 1
a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
Pressany key to continue
*/