一、概念及定义、初始化
概念:数组是用来存储一组数剧的构造数据类型,只能存放一种数据类型,数组里的数据称为元素,所以说元素的类型必须一致。
定义:
类型 数组名 [ 元素个数 ] 例如定义一个长度为五的整形数组 int array[5] //在内存中开辟4X5个字节的存储空间。 另外在定义数组的同时也可以初始化数组 int array[5]={17,18,19,20,21};
遍历数组
for(int i=0;i<5;i++)
{
Printf(“ages[%d]=%d\n”,i,ages[i]);
}
在对于数组进行初始化的时候应当注意:
int ages[5]={17,18,19,20,21};//一般写法
int ages[5]={17,18};//只对前两个元素赋值
int ages[5]={[3]=10,[4]=11};//对指定的元素赋值,这里为第三个和第四个
int ages[]={11,12,13}.//正确,右边的元素确定,则个数可以省略这里为3个。
int ages[];//错误,编译器无法知道应该分配多少的存储空间
int ages[5];ages={17,18,19,20,21};//错误,只能在定义数组时这样进行初始化
int ages[‘A’]={1,2,3};//正确,相当于是ages[65]
int count=5;int ages[count];//如果不进行初始化,则这种写法正确,编译器不会报错为其分配20个字节的存储空间,ages[0]=1;ages[1]=2;可以像这样对数组的元素进行赋值,但是2,3,4等元素的值时不确定的。
而int count=5;int ages[count]={1,2,3,4,5};//这种写法是错误的,在定义数组时对数组进行初始化,元素的个数必须为常量或者不写,不能是一个变量
二、计算数组的长度
对于没有标明元素个数的数组,可以使用sizeof运算符来计算数组元素的个数
int count=sizeof(ages)/sizeof(int); //数组的总长度除以单个的长度等于元素个数
三、数组的存储
假设有数组如下:
int x[]={1,2};
char ca[5]={‘a’,‘A’,‘B’,‘C’,‘D’};
数组名即代表数组的地址,数组的地址==数组名(ca)==数组的首元素的地址&ca[0]
在内存中,内存从大到小进行寻址,为数组分配了存储空间后,数组的元素自然的从上往下排列存储,整个数组的地址为首元素的地址。模拟该数组的内存存储细节如下:
注意:字符在内存中是以对应ASCII值的二进制形式存储的,而非上表的形式。
在这个例子中,数组x的地址为它的首元素的地址0x08,数组ca的地址为0x03
四、数组的传值与调用
void change(int array[]) //数组可以作为函数的形参,可以省略数组元素的个数
{
Array[0]=100;
}
void change2(int a) //基本类型作为函数的形参
{
a=200;
}
int main()
{
int ages[5]={1,2,3,4,5};
change2(ages[0]);
change(ages);
return 0;
}
Array数组与ages数组的地址一致,若以数组作为函数的参数,这种传递方式是传址调用,传递的是整个数组的地址,修改形参数组元素的值,就是修改实参的值。
当你把一个数组当做参数来传递时,它会看做是一个指针,在该函数体内使用sizeof运算符来计算数组的长度,得出的数值永远为8,而非数组的实际长度,因为任何类型的指针都占8个字节的存储空间。
提示:数组作为一个函数的参数时,如果函数体涉及到数组遍历等操作,通常把数组的实际元素个数也作为参数传递给函数。
如 void maxofarray(int array[],sizeof(ages)/sizeof(int)){....}
五、二维数组
1、二维数组的解释
一维数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组。
多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量。本节只介绍二维数组,多维数组可由二维数组类推而得到。
2、二维数组的定义
二维数组定义的一般形式是:
类型说明符 数组名[常量表达式1][常量表达式2]
其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。例如:
int a[3][4];
说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3×4个,即:
a[0][0], a[0][1], a[0][2], a[0][3]
a[1][0], a[1][1], a[1][2], a[1][3]
a[2][0], a[2][1], a[2][2], a[2][3]
int ages[50];//数组能够存放50个int类型的数据
int ages1[3][10];//数组能够存放3个数组,每个数组存放10个数值,共3x10=30个述职数值
二维数组可以使用在类似五子棋、俄罗斯方块等应用中。
二维数组使用,代码如下:
//求出各科的平均分以及总成绩的平均分
#include<stdio.h>
int main()
{
int i,j,s=0,average,v[3]; //循环变量以及总分平均分定义
int a[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
s=s+a[i][j];
}
v[i]=s/5; // 各科的平均分
s=0;
}
average=(v[0]+v[1]+v[2])/3;
printf("math:%d\nc languag:%d\ndFoxpro:%d\n",v[0],v[1],v[2]);
printf("total:%d\n", average);
return 0;
}
二维数组的存储情况:
假设:
char Y[3][2]={
{‘A’,‘B’},
{‘C,‘D’},
{‘E,‘F’}
};