• c语言学习之基础知识点介绍(十):数组


    本节主要介绍数组。

    一、数组

    /*
    数组:一个变量可以存n个变量。
    语法:类型   数组名[长度(正整数)];
    例如:int score[5];//定义了一个int类型的数组,长度为5,可以保存5个数据。
                char score[5];//定义了一个char 类型的数组,长度为5,可以保存5个数据。
    访问数组中的元素:
            取值:数组名[编号];
            赋值: 数组名[编号] = 值;
    
    元素:数组中实际存放的一个个数据。
    下标/索引:系统自动分配的编号,从0开始。
    长度:数组实际保存元素的个数。
    */
    //例如:
    int main(int argc,const char * argv[]){
          int scores[10];//可以保存10个数据。
          //循环为scores赋值。
          for(int i= 0;i<10;i++){
               scores[i] = i;
          }
          //循环打印scores的元素。
          for(int i= 0;i<10;i++){
               printf("第%d个元素的值为:%d 
    ",i+1,i);
          }
    }
    /*
    数组的赋值:
           1、先声明,后赋值。
                 类型 数组名[长度];
                 数组名[下标] = 值;
           2、在声明的时候初始化。
                  1)、类型 数组名[长度] = {数据1,数据2,数据3,数据4,.......};
                   例如:char  charTest[3] = {'a','b','c'};
                   2)、类型 数组名[] = {数据1,数据2,数据3,数据4,.......};
                   例如:char  charTest[] = {'a','b','c'};
                   //第二种方式的长度,编译器会根据元素的个数来确定。
                   3)、类型 数组名[5] = {数据1,数据2};//给的数据小于指定的长度
                   例如:char  charTest[5] = {'a','b','c'};
                   4)、类型 数组名[5] = {[下标]=数据1,[下标]=数据2,};//给的数据小于指定的长度
                   例如:char  charTest[5] = {[3] = 'a',[1] = 'b',[0] = 'c'};
    
    遍历数组:
            用循环依次访问数组中的每一个元素。
    
    数组的越界:
            定义:访问不属于数组本身空间的元素,运行时会报错,也可能是未知的异常。
    数组最大访问的下标:长度-1。
    
    计算数组的长度:
            sizeof(数组名);:得到这个数组占用内存的总长度。
            数组的长度 = sizeof(数组名) / sizeof(类型);
    注意:
            1、数组和数组变量之间,不能赋值。
             例如:int nums1[5] = {1,2,3,4,5};
                         int nums2[5] = nums1;
            2、数组名声明后也不能直接赋值。
             例如:int nums1[5] ;
                         nums1 = {1,2,3,4,5};
    原因:数组名是一个地址常量。
    */
    /*
    数组作为函数的参数:
             语法:返回值类型  函数名(类型  数组名[]){  函数体;  }
    注意:参数中数组的长度可不写,写了也没用,规范的写法时不写。
    
    下面看一组代码
    */
    void test1(int nums[]){
            nums[0]=11;
            nums[1]=22;
            nums[2]=33;
    }
    int main(int argc,const char * argv[]){
          int nums[] = {1,2,3};
          test();
          for(int i = 0;i<3;i++){
                  //注意:这里输出的不是1,2,3,而是11,22,33。
                  printf("%d 
    ",nums[i]);
           }
          return 0;
    }
    /*
    上面的代码涉及到另外一个概念:引用传递。
            概念:传递的是地址,相当于把该变量的内存地址共享给函数。
            特点:在函数内部改变了形参的值,外面的实参也会发生变化。
    说明:基本数据类型(int,char,long,double,float,short)不是引用传递;
                数组是引用传递。
    注意:1、在函数中,不能直接计算形参(数组)的长度,永远等于2。解决办法就是在多传递一个参数,作为数组的长度。
                2、函数的数组形参可以不写长度,但是区分类型。
    */    

    二、冒泡排序

    /*
    冒泡排序是一种排序算法。
    冒泡排序算法的运作如下:(从后往前)
            1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
            2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
            3、针对所有的元素重复以上的步骤,除了最后一个。
            4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    代码如下:
    */
    int main(int argc,const char * argv[]){
          //首先定义个数组
          int nums[5] = {23,4,7,2,77};
          int len = sizeof(nums)/sizeof(int);//得到数组的长度
          for(int i = 0;i < len - 1;i++ ){    //得到循环的次数
                for(int j = 0 j<len-i-1;j++){   //得到每次需要比较的次数
                       if(nums[j]>nums[j+1]){
                               int num = nums[j];//保存j元素的值
                               nums[j] = nums[j+1];//交换元素的位置
                               nums[j+1] = num ;//把j往后移
                       }
                }
          }
          return 0;
    }

    三、二维数组 

    /*
    二维数组:一个数组里面的元素又是一个数组。
    语法: 类型 数组名[常量表达式1][常量表达式2];
    例如:int nums[3][5];
    说明:常量表达式1可以理解为行数,常量表达式2可以理解为列数。上述代码可以理解为一个3行5列的数组,数组名为nums,其下标变量的类型为整型。该数组的下标变量共有3×5个,相当于一个拥有3行5列的平面。
    所以:类型 数组名[行数][列数];
    
    二维数组的初始化:
            1、先声明,后赋值。
    例如:
             int nums[3][5];
             nums[0][0] = 1;
             nums[0][1] = 2;
             nums[0][2] = 3;
             nums[0][3] = 4;
             nums[0][4] = 5;//以此类推
    取值:nums[0][4] = 5
             2、声明的时候初始化。
    1)、例如:int nums[3][5] = {{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5}};
    语法:类型 数组名[行][列] = {{元素列表},{元素列表},{元素列表}};
    取值:nums[0][4] = 5
    2)、例如:int nums[3][5] = {1,2,3,4,5,1,2,3,4,5,1,2,3,4,5};//这样会根据列数自动分行,等价于前一种方式。
    语法:类型 数组名[行][列] = {元素列表};
    取值:nums[0][4] = 5          
    3)、例如:int nums[][3] = {1,2,3,4,5,6}//省略行数,会根据列数自动检测分为几行
    语法:类型 数组名称[][列数] = {元素列表};
    取值:nums[0][2] = 3
    
    注意:行可以省略,但是列绝对不可以省略。
    */
    //例如:
    int nums[][3]={1,2,3,4};//这也是2行3列,按列数分行,不足的以0补齐。

    上面介绍了二维数组初始化的一些知识点,下面介绍二维数组的遍历、行和列的计算。

    /*
    二维数组相当于一个平面,所以需要用两个循环来控制。外层循环控制行数,内层循环控制行数。
    例如:
    int nums[2][3] = {1,2,3,4,5,6};
    for(int i=0;i<2;i++){
         for(int j=0;j<3;j++){
               printf("%d 
    ",nums[i][j]);
         }
    }
    输出:1 2 3 4 5 6
    二维数组计算列数:
    每行的总长度  /  元素占用的字节数
    sizeof(数组名[0])/sizeof(类型);
    例如:int nums[3][4];
                sizeof(nums[0])/sizeof(int);//得到4
    计算行数:
    二维数组的总产度  /  每行的长度
    sizeof(二维数组名)  /  sizeof(二维数组名[0]) 
    例如:int nums[3][4];
                sizeof(nums)/sizeof(nums[0]);//得到3
    */
  • 相关阅读:
    九九乘法表
    计算器界面
    3.2封装的日期类
    杨辉三角
    100以内的素数
    九九 乘法表
    七、logging模块
    六、MySQLdb 模块
    四、浏览器运行模式
    五、configparser模块
  • 原文地址:https://www.cnblogs.com/bobo-pcb/p/4915103.html
Copyright © 2020-2023  润新知