• C语言基础(10)-数组


    一.数组的定义

    数组就是在内存中连续的相同类型的变量空间。

    二.数组在内存中的存储方式

    同一个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的,数组名是一个地址的常量,代表数组中首元素的地址。

    三.数组的初始化

    3.1 一维数组初始化

    int a[10] = { 1, 2, 3 };
    int a[10] = { 0 };
    int a[10] = {1,2,3,4,5,6,7,8,9,10};
    int a[] = {1,2,3,4,5,6,7,8,9,10}; // 此写法与上面的写法是等价的

    注意:

    在C语言中,数组未初始化就使用是极其危险的,系统会为数组中的每一个元素指定一个随机的值,因此在使用数组之前最好先初始化。

    练习1:将指定数组反转

    定义下列数组

    int a[10] = {0,1,2,3,4,5,6,7,8,9};

    将该数组中的元素进行反转(最大值在前,最小值在后)。

    #include <stdio.h>
    
    void main() {
    
        int a[10] = {0,1,2,3,4,5,6,7,8,9};
    
        // int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    
        for (int i = 0; i < 10;i++) {
        
            printf("a[%d]=%d
    ",i,a[i]);
        }
    
        printf("------------------ 将数组反转 ------------------
    ");
    
        int min = 0; // 记录当前数组的最小下标
        int max = 9; // 记录当前数组的最大下标
    
        while (min < max) {
            int tmp = a[min]; // 记录当前较小下标的值
            a[min] = a[max]; // 将较大下标值赋值给较小下标的值
            a[max] = tmp; // 将较小下标的值赋值给较大下标的值
            min++;
            max--;
        }
    
        for (int i = 0; i < 10; i++) {
            printf("a[%d]=%d
    ",i,a[i]);
        }
    
        system("pause");
    
    }

     运行结果:

     练习2:遍历数组

    上面的遍历方式虽然可以使用,但是相对死板,假如数组a变为了:

    int a[10] = {0,1,2,3,4,5,6,7,8,9,10,11,12};

    则for循环中i的值也应做相应的修改。推荐写法:

    void main() {
    
        int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11 };
    
        for (int i = 0; i < sizeof(a) / sizeof(int); i++) { // int 类型占4个字节,sizeof(a)一共占40个字节,求得一共有10个元素
            printf("a[%d]=%d
    ",i,a[i]);
        }
    
        system("pause");
    }

    可以利用sizeof来妥善解决上面的问题。

    练习3:求一个数组中的最大值和最小值的下标

    已知一个数组为

    int a[] = {32,232,324,121,434,4343,34,2121,10,5,686866,4,77777777};

    求其最大值和最小值的下标

    void main() {
    
        // 找出该数组中最大值和最小值元素的下标
        int a[] = {32,232,324,121,434,4343,34,2121,10,5,686866,4,77777777};
        int min = a[0]; // 最小值
        int max = a[0]; // 最大值
        int min_loc = 0; // 最小值下标
        int max_loc = 0; // 最大值下标
    
        for (int i = 0; i < sizeof(a) / sizeof(int); i++) {
            if (a[i] > max) {
                max = a[i];
                max_loc = i;
            }
    
            if (a[i] < min) {
                min = a[i];
                min_loc = i;
            }
        }
    
        printf("最大值:%d,最小值:%d
    ",max,min);
        printf("最大值的下标为:%d,最小值的下标为%d
    ",max_loc,min_loc);
    
        system("pause");
    
    }

    练习4:查找数组中大于平均值的元素

    已知一个数组为:

    int a[] = { 32, 232, 324, 121, 434, 4343, 34, 2121, 10, 5, 686, 4,777};

    查找该数组中大于平均值的元素

    void main() {
    
        /* 查找数组中大于平均值的元素 */
        int a[] = { 32, 232, 324, 121, 434, 4343, 34, 2121, 10, 5, 686, 4,777};
    
        int num = sizeof(a) / sizeof(int); // 计算当前元素个数
        int total = 0; // 计算当前元素总和
        for (int i = 0; i < num; i++) {
            total += a[i];
        }
        int avg = total / num; // 计算当前数组平均值
        for (int i = 0; i < num; i++) {
            if (a[i] > avg) {
                printf("%d
    ",a[i]);
            }
        }
        system("pause");
    
    }

    执行结果:

    四.二维数组的定义及初始化

    // 二维数组的定义
        int a[3][4] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} };
        // int a[3][4] = { {1,2,3,4}, {5,6,7,8} }; // 正确,只初始化前两个维度
        // int a[][4] = { { 1, 2, 3, 4 }, {5,6,7,8} }; 正确
        // int a[2][] = { { 1, 2, 3, 4 }, {5,6,7,8} }; 这种写法是不对的
        // int a[][] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 } }; 这种写法是不对的

    练习1:遍历二维数组

    void main() {
    
        // 二维数组的定义
        int a[3][4] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} };
        // int a[3][4] = { {1,2,3,4}, {5,6,7,8} }; // 正确,只初始化前两个维度
        // int a[][4] = { { 1, 2, 3, 4 }, {5,6,7,8} }; 正确
        // int a[2][] = { { 1, 2, 3, 4 }, {5,6,7,8} }; 这种写法是不对的
        // int a[][] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 } }; 这种写法是不对的
    
    
        // 遍历当前二维数组
        int num_1 = sizeof(a) / sizeof(a[0]); // 一维数组元素个数
        int num_2 = sizeof(a[0]) / sizeof(a[0][0]); // 二维数组元素个数
    
        for (int i = 0; i < num_1; i++) {
            
            for (int j = 0; j < num_2; j++) {
                printf("a[%d][%d]=%d	",i,j,a[i][j]);
            }
            printf("
    ");
        }
    
        system("pause");
    }

    执行结果:

     

  • 相关阅读:
    javascript基础必学点
    怎样学习jQuery
    新手如何学习jQuery
    如何安装软件
    最近遇到的C++数字和字符串的转换问题
    二叉搜索树
    C++类型的转换
    希尔排序
    C语言里字符串的解析
    remove_if的问题
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/6247516.html
Copyright © 2020-2023  润新知