数组


1.  定义数组大小 const int 也可以
2.  初始化  int count [100] = {0}    还有 int count [] = {[1]=3,[5]=9} 0 3 0 0 0 9 
3.  赋值
4. 遍历  

  • sizeof () 给出整个数组所占据的内容的大小,单位是字节
    #include<stdio.h>
    int main(){
        int count [10] = {[1] = 3,[4] = 3};
        for(int i = 0 ; i < sizeof(count)/sizeof(count[0]);i++){
            printf("%d ",count[i]);
        }
        return 0;
    }

  • 数组不能赋值给另外一个数组                                     int a [] = {}; int b[] = a; 错误  需要通过遍历赋值

  • 当我们将数组作为参数时,往往必须再用另一个参数来传入数组大小  int search(int key, int a[] , int length){...}  不能利用sizeof来获取数组长度
    #include<stdio.h>
    void search(int a[]){
        for(int i = 0 ; i < sizeof(a)/sizeof(a[0]);i++){
            printf("%d ",a[i]);  //0 3  错
        }
    }
    int main(){
        int count [10] = {[1] = 3,[4] = 3};
        search(count);
        return 0;
    }


  • 数组单元在内存中是连续存放的
    #include <stdio.h>
    
    #include <stdlib.h>
    int main()
    {
        int a[10] = {0};
        int i = 0;
        printf("int类型占用内存%d个字节.\n", sizeof(a[0]) );
        for ( i = 0; i < 10; ++i)
        {
            printf("a[%d]的地址是%X\n", i, &a[i] );
        }
        return 0;
    }
    输出结果
    int类型占用内存4个字节
    a[0]的地址是0X22FEF4
    a[1]的地址是0X22FEF8
    a[2]的地址是0X22FEFC
    a[3]的地址是0X22FF00
    a[4]的地址是0X22FF04
    a[5]的地址是0X22FF08
    a[6]的地址是0X22FF0C
    a[7]的地址是0X22FF10
    a[8]的地址是0X22FF14
    a[9]的地址是0X22FF18
    可以看出在内存中是连续存储的。

  • 二维数组 a[i,j] = a[j] 逗号运算符

数组可以存放在变量里,每一个变量都有自己的名字,有一个类型,还有它的生存空间。如果我们需要保存一些相同类型、相似含义、相同生存空间的数据,我们可以用数组来保存来保存这些数据,而不是用很多独立的变量。
数组是长度固定的数据结构,用来存储指定的数据。一个数组可以有很多个数据,所有数据的类型都是相同的。


  • 没有数组求平均数
    #include <stdio.h>
    int main (){
      int x ;   
      double sum = 0 ;
      int cnt = 0;
      scanf("%d",&x);
      while(x!=-1){
          sum += x;
          cnt++;
          scanf("%d",&x);
      }
      if(cnt!=0)printf("%f\n",sum/cnt);
      return 0;
    }
  • 数组解决所有数大于平均数
    #include <stdio.h>
    int main (){
      int x[100] ;    //安全隐患  a 可能会大于100;
      double sum = 0 ;
       scanf("%d",&x[0]);
      int a = 0;
      while(x[a]!=-1){
          sum += x[a];
          a++;
          scanf("%d",&x[a]);
      }
      double temp = sum/a;
      printf("%f\n",temp);
          int i ;
      for (i = 0 ; i <= a ; i++ ){
          if(x[i]<=temp)printf("%d\n",x[i]);
      }
      return 0;
    }

定义数组【容器】+ 初始化!!!!        

<类型> 变量名称[元素数量];
C99之前:元素数量必须是编译时刻确定的字面量 不能是变量,C99后就可以int a [b]

  • 是一种容器(放东西的东西)
  • 其中所有的元素具有相同的数据类型
  • 一旦创建,不能改变大小
  • 数组中元素在内存是中是连续依次排序的
  • 从0开始,编译器省了很多工作

有效的下标范围

  • 编译器和运行环境都不会检查数组下标是否越界,无论是对数组单元做读还是写
  • 一旦程序运行,越界的数组访问可能会造成问题,导致程序奔溃
  • segmentation fault
  • 但是可能运气好,没造成严重后果
  • 所以这是程序员的责任来保证程序只使用有效下标值:[0...数组大小-1]
  • 数组建立后要进行初始化,如果数组里的值都是无法预测的。越界是可以继续运行的 a[10] = 一个未知数 a[10] = 1 会报错
  • 可以创建长度为0 的数组 可以存在,但是无用

for(int i=0;i<9;i++) 在c语言中是错误的?

答:C99标准以前的C标准是不支持临时变量在for循环中定义的,C99标准就支持这样写。但是目前有些编译器并不怎么愿意支持C99标准,或者默认以C89模式进行编译执行。



数组运算

初始化

  • int arr[] = {1,2,3,4,5}
  • 初始化 for () {}
  • int arr [!=1] ={0}
  • int arr[][5] = {{0,1,2,3,4},{5,6,7,8,9}}; 初始化
  • 列数是必须要给出的,行数可以由编译器得出
    i,j => j


找素数的方法
  • 从2到x-1
  • 从2到sqrt(x)
  • 拿比x小的所有素数进行判断
  • 构造一个素数表

统计sum%6 count[i]%6 * (i+1)%6