天天看点

黑马程序员-C学习日记-数组

                 ------- ios培训、android培训、java培训、期待与您交流! ----------

一. 数组的基本概念

1. 数组:用来保存多个相同数据类型的数据的集合

定义变量:   数据类型 变量名称

定义数组:   数据类型 数组名称[元素个数]

二. 数组的多种初始化方式

数组只有定义了才能进行初始化,只有初始化才能使用

数组遍历:取出数组中的每一个元素看一下

代码演示:

#include <stdio>
int main(int argc ,const char *argv[]{
// 定义一个数组 
 int scores [0];={1,9,9,0,7,9,11};
// 计算数组所占用的字节数,也就是数组元素个数
   int count = sizeof(nums)/sizeof(int);
 // 遍历数组:  
   for(int i=0;i<count;i++){
       printf("scores [%d]=%d",i,nums[i]);
    }
   return 0;
}
           

1.  1使用常量作为元素个数

1.2使用变量作为元素个数(C99不支持使用变量作为元素个数,但是LLVM支持)

使用变量作为元素个数的好处:你可以在程序运行到这一行的时候再决定要创建有多少元素的数组

   

2.  定义数组的同时进行初始化

2.1指定元素个数,同时全部进行初始化

 int nums[5] = {1,2,3,4,5}

2.2 不指定元素个数,全部进行初始化

 int nums[] = {1,2,3,4,5}

2.3 指定元素个数,部分初始化:从下标为0的元素开始初始化,没有显式初始化的元素系统自动将其初始化为0

 int nums[5] = {1,2}

2.4 指定元素个数,为指定的元素初始化

 int nums[5] = {[1] = 1,[2]=5}

注意:定义数组同时进行初始化的时候,不可以使用变量作为元素个数

三. 数组的存储细节

数组名称本身就是一个地址

1.数组的地址就是第一个元素的地址

2.数组是一块连续的存储空间

3.下标小的元素地址在小地址上,下标大的元素在大地址上

黑马程序员-C学习日记-数组

注意:

数组下标越界导致的问题:

约错对象,访问你不该访问的元素,出现莫名的错误

越界超出很大范围,程序崩溃

 注意:

1.基本数据类型作为函数参数传递是值传递;

2. 数组作为函数参数类型传递是地址传递,如果在函数中改变数组的某个值,实参的值也会改变。

3. 当数组作为函数参数传递的时候,会被自动转换为指针类型。所以在函数中不能获取形参数组的长度,只能由主调函数传入

四.二维数组的基本概念

二维数组:元素为一维数组的数组;

格式:数据类型 数组名称[一维数组个数][一维数组元素个数]

五.定义二维数组

 char scores[3][2]

黑马程序员-C学习日记-数组

遍历二维数组:

代码演示:

#include <stdio>
int main(int argc ,const char *argv[]{
 //定义一个二维数组
  char scores[3][2]
 //外层循环控制行(一维数组的个数)
  for(int i=0;i<3;i++){
     //内层循环控制列(一维数组元素个数)
     for(int j=0;j<2,j++){
       printf("scores[%d][%d]=%c\n",i,j,scores[i][j]);
      }
   }
  return 0;
}
           

二维数组的多种初始化方式:

1. 先定义二维数组,然后初始化(定义二维数组的时候必须指定一维数组的元素个数)

2. 定义二维数组同时初始化

  2.1 指定一维数组个数,对全部元素进行初始化

      int  scores[3][2]={{1,2},{3,4},{5,6}};

  2.2不指定一维数组个数,对全部元素进行初始化

     int  scores[][2]={{1,2},{3,4},{5,6}};

  2.3 指定一维数组的元素个数,用一个大括号进行初始化

     int  scores[3][2]={1,2,3,4,5,6};

     int  scores[][2]={1,2,3,4,5,};

Ps:定义的同时进行初始化,没有显式初始化的元素会被自动初始化为0

六. 练习

1.录入一个班级成绩,然后计算平均分,班级中有多少人需要自己录入

#include <stdio.h>
int main(int argc ,const char *argv[]{
 // 定义学生人数变量,提示用户输入班级学生的人数
  int count;
  printf("请输入班级学生人数\n");
 // 接收用户的录入
  scanf("%d",&count);
 //定义一个数组保存学生成绩
  int scores[count];
 //接收用户录入的每一个学生的成绩
 for(int i=0;i<count;i++){
    printf("请录入第%d个学生成绩:\n",i+1);
    scanf("%d",&scores[i]);
  }
 //计算学生总成绩
   int sum = 0;
   for(int i=0;i<count;i++){
     sum+=scores[i];  
    }
 //计算平均值
   double average = (double)sum/count;
 //输出学生平均成绩
   printf("学生平均成绩为:%.2lf\n",average);
   
   return 0;
}
           

2. 冒泡排序规则:大的下沉,小的上浮

黑马程序员-C学习日记-数组
#include <stdio.h>
int main(int argc ,const char *argv[]{
 升序排列数组元素
 int nums[]={1,9,9,0,7,9,11};
 //计算数组长度
 int length = sizeof(nums)/sizeof(int);
 //使用冒泡排序
 //外层循环控制趟数
 for(int i=0;i<length-1;i++){
     //内层循环控制每一趟比较多少次
     for(int j=0;j<length-1-i);j++{
        //元素两两比较,如果前面元素大,则与后面的元素交换位置 
         if(nums[j]>nums[j+1]){
           int temp;
           temp = nums[j];
           nums[j]=nums[j+1];
           nums[j+1]=temp;
          }
      }
  }
  遍历数组,打印排序后的结果
  for(int i=0;i<length;i++){
      printf("%d ",nums[i]);
   }

  return 0;
}