数组

printf("输入一些数,最后输入-1结束:\n");
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\n", sum/cnt);
   int i;
   for ( i=0; i<cnt; i++ )
   {
      if (number[i] > sum/cnt)
      {
         printf("%d\n", 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},
};                                   //列数必须有,行数可省略,每个每行一个{},逗号隔开

02-14 03:07