黑马程序员——C语言——数组

来源:互联网 发布:印刷厂软件 编辑:程序博客网 时间:2024/05/19 10:40

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、数组的概念

把具有相同类型的若干变量按有序的形式组织起来.这些按序排列的同类数据元素的集合称为数组。

数组的几个名词

              (1)数组:一组具有相同数据类型的数据的有序的集合 。

              (2)数组元素:构成数组的数据。数组中的每一个数组元素具有相同的名称,不同的下标,可以作为单个变量使用,所以也称为下标变量。

              (3)数组的下标:是数组元素的位置的一个索引或指示。

              (4)数组的维数:数组元素下标的个数。根据数组的维数可以将数组分为一维、二维、 三维、多维 数组。

二、一维数组

(一)一维数组的定义:类型说明符 数组名[常量表达式];

        数组定义的注意点:

              (1)数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。第一个数组元素的地址是数组所占内存块的首地址

              (2) 数组名的书写规则应符合标识符的书写规定。 

              (3) 数组名不能与其它变量名相同。
              (4)方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标从0 开始 计算。因此5个元素分别为a[0], a[1], a[2], a[3], a[4]
              (5)不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。
              (6)允许在同一个类型说明中,说明多个数组和多个变量。

(二)一维数组的初始化

数组初始化赋值是指在数组定义时给数组元素赋予初值。数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。初始化方式有两种:定义的同时初始化、先定义,后初始化:

              (1)定义的同时初始化

类型说明符数组名[常量表达式] = { 值, 值......值 };

                又细分以下几种情况: 

                     1)指定元素的个数的同时,对所有的元素进行显式的初始化

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

                     2)指定数组的元素个数,对数组进行部分显式初始化 定义的同时对数组进行初始 化,没有显式初始化的元素,那么系统会自动将其初始化为0

int nums[10] = {1,2};

                     3)不指定元素个数,定义的同时初始化,它是根据大括号中的元素的个数来确定数组 的元素 个数

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

                     4)指定元素个数,同时给指定元素进行初始化

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

                     给数组赋值的方法除了用赋值语句对数组元素逐个赋值外还可采用初始化赋值和动态赋值的方法
              (2)先定义,后初始化 
//正确写法: int nums[3]; nums[0] = 1; nums[1] = 2; nums[2] = 3;//错误写法:int nums[3];nums = {1,2,3}; // 因为数组名是一个常量,是数组的首地址,所以不能这样赋值.
(三)一维数组初始化后的值

              (1)如果定义数组后,没有初始化,数组中是有值的,是随机的垃圾数,所以如果想要正确使用 数组应该要进行初始化。
              (2)对于数组来说,一旦有元素被初始 化,其他元素都被赋值0。

(四)一维数组的使用

              (1)一维数组的引用方式   数组名[下标]    数组元素通常也称为下标变量,必须先定义数组,才能够使用下标变量。

              (2)一维数组的遍历:使用for循环可以对数组进行遍历,如下面的例子:要求用户输入数组的长度,并分别为每一个元素赋值,打印出各个元素。

#include <stdio.h>int main(int argc, const char * argv[]) {    //定义变量    int len;    printf("请输入数组的长度:\n");    //提醒输入一个数字    scanf("%d",&len);    //构建一个数组    int a[len];    //for 写入数组    for (int i = 0; i < len; i++) {        printf("请输入数组的第%d的值",i+1);        scanf("%d",&a[i]);    }//    读取数组中的每一个数字    for (int i = 0; i < len; i++) {        printf("%d\t",a[i]);    }    return 0;}
(五)一维数组的地址

              (1)数组内部的元素地址是连续的在内存中,内存从大到小进行寻址,为数组分配了存储空间后,数组的元素自然的从上 往下排列 存储,整个数组的地址为首元素的地址。

              (2)数组名存放的是数组的首地址 数组的首地址:数组的第一个元素首地址(第一个元素的第一个字节地址)。

              (3)数组每个元素的地址 就是每个元素的首地址。

(六)冒泡排序

              冒泡排序分为: 大数下沉、小数上浮

              (大数下沉)

               1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。

              2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应 该会是最大的数。

              3)针对所有的元素重复以上的步骤,除了最后一个。 

              4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

冒泡排序的实现:

#include <stdio.h>//冒泡排序void maoPao(int arr[],int len){    int temp;    for (int i =0; i < len-1 ; i++) {        for (int j = 0; j < len-1-i; j++) {            if (arr[j] >arr[j+1]) {                temp = arr[j];                arr[j] = arr[j+1];                arr[j+1] = temp;            }        }    }}int main(int argc, const char * argv[]) {    // 定义一个数组 元素为十个随机的数字    int a[10] = {1,3455,455,356,357,332,67,234,345,78};    for (int i = 0; i < 10; i++) {        printf("%d\t",a[i]);//打印十个数字    }    printf("\n");    //冒泡排序    maoPao(a, 10);    for (int i = 0; i < 10; i++) {        printf("%d\t",a[i]);//打印排序之后的数字    }    printf("\n");    return 0;}

(七)选择排序

              首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。

选择排序的实现:

#include <stdio.h>//选择排序void selectSort(int arr[],int len){    int temp;   //写 双重循环    for (int i =0; i<len-1; i++) {        for (int j = i+1; j<len; j++) {            //交换            if (arr[i]>arr[j]) {                temp = arr[i];                arr[i] = arr[j];                arr[j] = temp;            }        }    }}int main(int argc, const char * argv[]) {    //定义一个数组    int a[10] = {74,75,84,93,40,229,49,54,86,58};    for (int i = 0; i < 10; i++) {        printf("%d\t",a[i]);//打印交换前的各个元素    }    printf("\n");    //排序    selectSort(a, 10);    for (int i = 0; i < 10; i++) {        printf("%d\t",a[i]);//打印交换后的各个元素    }    printf("\n");    return 0;}
三、二维数组

(一)二维数组的定义

            类型说明符 数组名[常量表达式1][常量表达式2] 

            二维数组定义注意事项:

            1)数组名严格遵守标识符命名规范 

            2)二维数组名不能和变量同名

            3)数组长度可以是常量,也可以是常量表达式

            4)二维数组长度可以是宏定义 

            5)xcode编译器支持,C99标准不允许的写法

(二)二维数组初始化 

            (1)二维数组可:

             按行分段赋值

  int a[5][3]={ {80,75,92},            {61,65,71},            {59,63,70},             {85,87,90},             {76,77,85} };

            也可按行连续赋值。

int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};

            (2)定义同时初始化 

                          完全初始化

int a[2][3]={{1,2,3},{4,5,6}}; ------------分段赋值//赋值的时候可以省略内层的大括号 //系统会自动根据数组的第二维的长度,把值划分为对应的组 int a[2] [3]={1,2,3,4,5,6}; ------------连续赋值//如果说完全初始化,可以省略第一维的长度int a[][3]={{1,2,3},{4,5,6},{1,2,3}}; //3

                          部分初始化

//部分初始化int a2[3][3]={{1,2},{2,3,4},{4}};//省略括号的部分初始化 int a3[3][3]={1,2,3,4,5,6,7};//省略第一维,部分初始化 int a3[][3]={1,2,3,4,5,6,7};//指定元素的初始化 int a4[3][3]={[1]={1,2,3}}//指定元素的初始化 int a5[3][3]={[1][2]=10};

               (3)先定义,后初始化       

int a[m][n];//下标范围:a[0][0] ~ a[m-1][n-1]; a[0][0]=10; //第一个元素 a[m-1][n-1] = 100; //最后一个元素

(三)二维数组遍历

            可以使用嵌套for循环对二维数组进行遍历:

void printArry(int m,int n, int a[m][n]){    for (int i = 0; i < m; i++) {        for (int j = 0; j < n; j++) {            printf("%d\t",a[i][j]);        }        printf("\n");    }}
(四)二维数组做函数参数

            (1)二维数组元素作为函数参数 二维数组元素作为函数参数,相当于变量的值传递过程。

            (2)二维数组名作为函数参数 二维数组名作为函数参数,相当于地址传递。

#include <stdio.h>//将数组的每一个元素赋值为0void initArray(int m,int n, int a[m][n]){    for (int i = 0; i < m; i++) {        for (int j = 0; j < n; j++) {            a[i][j] = 0;        }    }}//遍历并打印数组中的每一个元素void printArry(int m,int n, int a[m][n]){    for (int i = 0; i < m; i++) {        for (int j = 0; j < n; j++) {            printf("%d\t",a[i][j]);        }        printf("\n");    }}int main(int argc, const char * argv[]) {    int m,n;    printf("请输入数组的行数和列数,用逗号分隔:\n");    scanf("%d,%d",&m,&n);//    产生一个数组    int arr[m][n];    initArray(m, n, arr);    printArry(m, n, arr);    return 0;}



0 0