数组
printf("输入一些数,最后输入-1结束:
");
int x;
double sum = 0;
int cnt = 0;
int number[100]; //可以放100个int 定义数组
scanf("%d", &x);
while ( x!= -1 )
{
number[cnt] = x; //对数组中的元素进行赋值 cnt那个位置上的元素等于x。
sum += x;
cnt ++;
scanf("%d", &x); //读下一个x,前面的scanf只读第一个出现的数,而while条件里的x值并不会改变。
}
if ( cnt >0 )
{
printf("%f
", sum/cnt);
int i;
for ( i=0; i<cnt; i++ )
{
if (number[i] > sum/cnt)
{
printf("%d
", number[i]); //使用数组中的元素
}
} //遍历数组,把数组中的每一个单元走透透
}
a、<类型> 变量名称[元素数量]
I、int grades[100];
//grades数组,有一百个单元。
·元素数量必须是整数,c99之后可以用变量来定义数组的大小。也就是int a[x]
变量表示数组
int x;
double sum = 0;
int cnt;
printf("请输入数字的数量:");
scanf("%d",&cnt);
if( cnt>0 )
{ int number[cnt];
scanf("%d",&x);
while ( x!= -1 )
{
number[cnt] = x;
sum += x;
cnt ++;
scanf("%d",&x);
}
}
II、数组就是一个容器(放物品的东西),
特点是:
·其中所有元素的数据类型一致。
·一旦创建就无法改变大小。
·数组中的元素在内存中是连续依次排列的。(而且是紧密排列的)
III、
·可以出现在赋值的左边或右边。
·a[2]=a[1]+6 //a[1]的值读出来+6后,写入到a[2]里去。
·在赋值左边的叫做左值。
IV、
·数组的每一个单元就是数组类型的一个变量。
·使用数组时放在[]中的数字叫做下标或索引,从零开始编号。每次都是n-1
·编译器和运行环境都不会检查数组下标是否越界,注意不要越界。 越界错误提示:segmentation fault
V、int a[0]
可以存在,但并没有什么用处。
b、初始化数组的例子。
c、数组的集成初始化,
eg、int a[] = {2,4,5,6,7,1,8,9,11,33,45,67,22}
eg:a[3]={22,33,44}
若写成a[3]={22},则后面的33,44都会被认为是0
I、集成初始化时的定位。
·用[n]在初始化数据中给出定位。
·没有定义的数据接在前面的位置后面。
·其他位置的值补零。
·也可以不给出数组大小,让编译器算。
·特别适合初始数据稀疏的数组。
eg:int a[13] ={[1]=2, 4, [5]=6,} //此逗号有必要,为下一步写数据进数组提供便利。 输出结果为:0 2 4 0 0 6 0 0 0 0 0 0 0 //c99才适合
若为a[]={[1]=2, 4, [5]=6,} 输出结果就为:0 2 4 0 0 6
d、数组的大小
·sizeof:给出整个数组所占据的内容的大小,单位是字节。 (是一个数组总共的字节数哈) sizeof(a)/sizeof(a[0]) //得到的结果就是数组的大小
·sizeof(a[0])给出数组单个元素的大小。 sizeof(a[0])就是一个元素占的字节数
初始化数组的三种方法:
1、
void function1()
{
char array[ARRAY_SIZE_MAX] = {0}; //声明时使用{0}初始化为全0
}
2、
void function2()
{
char array[ARRAY_SIZE_MAX];
memset(array, 0, ARRAY_SIZE_MAX); //使用memset方法
}
3、
void function3()
{
int i = 0;
char array[ARRAY_SIZE_MAX];
for (i = 0; i < ARRAY_SIZE_MAX; i++) //for循环赋值
{
array[i] = 0;
}
}
f、数组的赋值
能不能 int a[]={1,3,4,5,6,};
int b[]= a;
无法将一个数组变量赋值给另一个数组变量的
·数组变量本身不能被赋值
·要把一个数组的所有元素交给另一个数组,必须采取遍历,也就是写一个循环,将一个数组的每个元素,赋给另一个数组
遍历数组赋值:
for ( i=0; i<length; i++ )
{
b[i] = a[i];
}
遍历数组做初始化
for ( i=0; i<length; i++ )
{
count[i] = 0;
}
判断
·通常都是使用for循环,让循环变量i从0到<1数组的长度,这样的循环体内最大的i正好是数组最大的有效下标。
·常见错误:
·循环条件是<=数组长度,/离开循环体后,继续用i的值来做数组元素的下标! //因为离开循环后,i的值正好是无效的下标。eg i=0; i<length; i++ 此时i的值正好是length.
g、数组作为函数参数的时候,往往必须再用另一个参数来传入数组的大小。
h、数组作为函数的参数时:
·不能在[]中给出数组的大小。
·不能再利用sizeof来计算数组的元素个数。
int search(int key, int a[], int length) //作为函数的参数
{
int ret = -1;
int i;
for ( i=0; i<length; i++ )
{
if( a[i] ==key )
{
ret = i;
break;
}
}
return ret;
}
2、二维数组 int a[3][5]; //通常理解为3行5列的矩阵。
a、二维数组的遍历。
for ( i=0; i<3; i++ )
{
for( j=0; j<5; j++)
{
a[i][j] = i*j; //a[i][j]是一个int,表示第i行第j列上的单元
}
} //二维数组,两重循环,才能遍历。
a[i,j] 错误表达二维数组的方式
b、二维数组的初始化
int a[][3] ={
{1,3,4},
{2,3,4},
}; //列数必须有,行数可省略,每个每行一个{},逗号隔开