数组

  在一个工程中,当你需要大量同类型变量的时候,若是程序员自己一个一个定义,无疑是在浪费生命。然而数组可以帮我们解决这个问题,数组能够批量定义一些变量,而且利用数组所定义的变量有一个最大的特点就是这些变量在内存空间上都是连续的,因此定义好之后,使用起来也十分的方便。帮助程序员节约了大量的时间。

一维数组

  定义方式:

type_t arr_name[const_n];

  初始化:

#define _CRT_SECURE_NO_WARNINGS
//添加头文件
#include <stdio.h>
#include <stdlib.h>
//主函数,函数入口
int main()
{
        //创建一个10个元素大小的整形数组
    int arr1[10];
        //创建一个10个元素大小的整形数组,并将前3个元素赋值,未赋值元素 默认为0
    int arr2[10] = { 1,2,3 };
        //创建一个3个元素大小的整形数组,并且赋值
    int arr3[] = { 1,2,3 };
        //创建一个字符数组用来存储字符串"abcdef",且以“\0”结尾
    char arr4[] = "abcdef";
//创建一个字符数组用来存储字符串“abcdef”,无"\0"
char arr4[] ={‘a’,'b','c','d','e','f'};
return 0; }

  注:①数组在定义且不初始化的时候,必须表明数组的大小,也就是方括号内的数字,且必须是常量。

    ②数组在定义的时候且初始化内容了,那么可以不用标明数组的大小,编译器会自动判定出数组的大小,分配相应的空间。

    ③访问某一个元素可以通过“数组名[下标]”来进行,不过需要注意的是,数组中元素的下标,是从0开始的,也就是说第一个元素的下标为0,第二个元素为1,以此类推,在访问数组元的时候需要注意。

    ④数组名就是数组元素的首地址,而每一个元素的地址就是:数组元素首地址+数组下标*数组类型的字节大小。

  下面为一维数组的一个简单使用:

#define _CRT_SECURE_NO_WARNINGS
//添加头文件
#include <stdio.h>
#include <stdlib.h>
//主函数,函数入口
int main(){
        //数组的创建及初始化
    int arr[10] = { 0 };
    //计算数组元素的个数
    int size = sizeof(arr) / sizeof(arr[0]);
    //让数组中每个元素的值等于在数组中的下标
    for (int i = 0; i < size; i++){
        arr[i] = i;
    }
    //打印数组的内容
    for (int i = 0; i < size; i++){
        printf("%d\t", arr[i]);
    }
    printf("\n");
    return 0;
}

 

二维数组

  定义方式:

type_t arr_name[const_n][const_n];

 

  初始化:

#define _CRT_SECURE_NO_WARNINGS
//添加头文件
#include <stdio.h>
#include <stdlib.h>
//主函数,函数入口
int main()
{
    int arr1[3][4] = {
        {1, 2, 3, 4},
        {2, 2, 3, 4},
        {3, 2, 3, 4},
    };
    //定义的数组是这样的
    //    1 2 3 4
    //    2 2 3 4
    //    3 2 3 4
    int arr[3][4] = { 1, 2, 3, 4 };
    //定义的数组是这样的
    //    1 2 3 4
    //    0 0 0 0
    //    0 0 0 0
    int arr[3][4] = {
        {1, 2},
        {3, 4},
    };
    //定义的数组是这样的
    //    1 2 0 0
    //    3 4 0 0
    //    0 0 0 0
    int arr[][4] = {
        {2, 3},
        {4, 5},
    };
    //定义的数组是这样的
    //    2 3 0 0
    //    4 5 0 0
    return  0;
}

  注:①二维数组的初始化与一维数组十分相似,但略有不同。二维数组在定义的时候可以省略行下标,但不能省略列下标。

    ②编译器也会自动根据你初始化的形式来确定数组的元素,具体情况参照上面的初始化案例,体会理解每一种形式的效果。

    ③二维数组的遍历需要用到双重循环,且起始都为0。

    ④二维数组虽然看起来是二维的,但在内存中的分布仍旧是一维排列的,且紧密相连的,只是我们人为地抽象成为二维的。

  下面为二维数组的一个简单使用:

#define _CRT_SECURE_NO_WARNINGS
//添加头文件
#include <stdio.h>
#include <stdlib.h>
//主函数,函数入口
int main(){
    int arr[3][4] = { 0 };
    for (int i = 0; i < 3; i++){
        for (int j = 0; j < 4; j++){
                        //给每一个元素赋值一个表达式,变量为i,j
            arr[i][j] = 5* i + 2*j+1;
        }
    }
        //二维数组的遍历需要用到双重循环,且起始都为0
    for (int i = 0; i < 3; i++){
        for (int j = 0; j < 4; j++){
            printf("%d\t", arr[i][j]);
        }
                //打印一行元素就换行
        printf("\n");
    }
    return 0;
}

数组作为函数参数

  数组作为函数参数传入时,会自动隐性的转换为指针,所以在被传入的函数中,是无法使用

sizeof();

求得数组的大小的,因为指针大小是固定的,所以

void max(int arr[]){
    int size=0;
    //这个式子永远等于1
    size=sizeof(arr)/sizeof(arr[0]);
}

 

  要想知道数组的大小,就应该在传入参数之前就求出数组大小,并当做一个参数传入函数,如下所示:

void max(int arr[],int size){
  ...
}