• C语言学习(七)之数组


    一、数组

    1.1 为什么需要数组

    1、为了解决大量同类型数据的存储和使用问题
    2、为了模拟现实世界

    1.2 数组的分类

    数组有三种分类:

    1、一维数组
    2、二维数组
    3、多维数组
    
    • 1
    • 2
    • 3

    1.3 一维数组

    1.3.1 定义数组

    1、为n个变量连续分配存储空间。
    2、所有的变量数据类型必须相同
    3、所有变量所占的字节大小必须相等
    
    • 1
    • 2
    • 3
    1.3.1.2 基本操作
    1.3.1.2.1 初始化
    • 完全初始化
    int a[5] = {1, 2, 3, 4, 5}; //在定义数组时就完全赋值
    
    • 1
    • 不完全初始化,未被初始化的元素自动为零
    int a[5] = {1, 2, 3};// 在定义数组时部分值初始化
    
    • 1
    • 不初始化,所有元素的值不确定,都是垃圾值
    int a[5];
    
    • 1
    • 零数组
    int a[5] = {0}; // 所有的元素都为零
    
    • 1
    • 只有在定义数组的同时才可以整体赋值,其他情况下整体赋值都是错误的
    int a[5] = {1, 2, 3, 4, 5};
    
    • 1
    • 初始化只读数组
      有时需要把数组设置为只读,这时只能从数组中检索值,不能把新值写入数组。要创建这样的数组时,应该用const关键字声明和初始化数组。
    // 使用const关键字声明后,该数组就只能读,不能修改
    const char ch[5]={1, 2, 3, 4, 5};
    
    • 1
    • 2
    1.3.1.2.2 查找

    数组的查找是按下标索引进行的,索引是从0开始。

    #include 
    
    int main(){
    
    // 定义一个数组
    char ch[5]={11, 21, 22, 33, 44};
    
    // 取出数组的第2个值,因为索引是从0开始,ch[1]表示取出数组的第二个值。
    printf("%d", ch[1]); // 返回21
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    当需要取出数组全部的值时,要使用循环的方式取出全部的值

    #include 
    
    int main(){
    
    //定义数组
    char ch[5]={11, 21, 22, 33, 44};
    // 定义自增变量
    int i;
    // for循环取值
    for(i=0; i<5; i++){
        printf("%d\n", ch[i]);
    }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    字符数组的全部取出可以借助strlen()函数计算数组的长度。

    #include 
    // 使用strlen函数需要引用此头文件
    #include 
    
    int main(){
    
    //定义字符数组
    char arr[]={'a', 'b', 'c', 'd'};
    // 自增变量
    int i;
    // 循环取出字符数组的值。strlen计算arr数组的长度,但索引从0开始,需要减1
    for(i=0; i<strlen(arr)-1; i++){
        printf("%c\n", arr[i]);
    }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1.3.1.2.3 赋值

    声明数组后,可以借助数组下标(或索引)给元素赋值。对要赋值修改的元素的下标直接赋值即可。

    #include 
    #include 
    
    int main(){
    
    char arr[]={'a', 'b', 'c', 'd'};
    
    int i;
    // 将arr数组的第2个元素修成'e'
    arr[1] = 'e';
    for(i=0; i<strlen(arr)-1; i++){
    
        printf("%c\n", arr[i]);
    }
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    1.3.1.2.4 数组复制

    在C语言种不能直接将1个数组赋值给另一个数组。需要遍历循环赋值给另一个数组。

    int a[5] = {1, 2, 3,  4, 5};
    int b[5];
    //如果要把a数组中的值全部复制给b数组
    
    
    • 1
    • 2
    • 3
    • 4

    错误写法:

    b = a 	//error
    
    • 1

    正确写法:

    for (i = 0; i < 5; ++i)
    	b[i] = a[i]
    
    • 1
    • 2
    1.3.1.2.5 数组排序

    这里先放置一个简单的冒牌排序,后面会继续详解

    # include 
    
    // 冒泡排序函数
    void bubble_sort(int arr[], int len){
    
        int i, j;
        int temp=0;
        for(i=0;i<len;i++){
            for (j = 0; j<len-i-1; j++){
            if (arr[j] > arr[j+1]){
                temp=arr[j];
                arr[j]= arr[j+1];
                arr[j+1]=temp;
                }
            }
        }
    }
    
    // 主函数
    int main(void){
    
        int i;
        int arr[]={5, 2, 7, 6, 9, 3, 4, 12, 10};
        int len = sizeof(arr)/sizeof(int);
        // 
        bubble_sort(arr, len);
    
        for (i = 0; i < len; i++)
        {
            printf("%d\n", arr[i]);
        }
    	return 0;	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    1.4 二维数组

    二维数组表示的是行和列,如下实例则表示一个3行4列的二维数组。二维数组在内存中存储时是存储在连续的内存空间中。

    int a[3][4]; //总共有12个元素,可以当作3行4列看待。a[i][j]表示第i+1行第J+1列的元素
    
    • 1

    1.4.1 初始化

    二维数组同一维数组一样,同样有完全初始化和不完全初始化。不完全初始化时未初始化的值为零。

    完全初始化方式一:

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

    完全初始化方式二:

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

    不完全初始化:

    // 不完全初始化,后面的8个元素全为0
    int arr[3][4]={1, 2, 3, 4}
    
    • 1
    • 2
    1、在初始化时,行可以省略,但列不能省略。
    2、初始化时建议使用方式二的方式初始化。
    
    • 1
    • 2

    1.4.2 基本操作

    1.4.2.1 输出数组的内容
    # include 
    
    int main(void)
    
    {
    	int a[3][4] = {
    		{1, 2, 3, 4},
    		{5, 6, 7, 8},
    		{9, 10, 11, 12}
    	};
    	int i, j;
    	for (i = 0; i < 3; ++i)
    	{
    		for (j = 0; j < 4; ++j)
    			printf("%-5d	",a[i][j]);	//-5表示左对齐五个字符。
    		printf("\n");
    	}
    	return 0;	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    1.5 多维数组

    1、是否存在多维数组
    不存在,因为内存是线性唯一的,n维数组可以当作每个元素是n-1维数组的一维数组。
    比如:

    int a[3][4]
    
    • 1

    可以当做每个元素都含有4个小元素的一维数组。

    int a[3][4][5]
    
    • 1

    该数组含有3个元素的一维数组,只不过每个元素都是4行5列的二维数组。

  • 相关阅读:
    【深度思考】聊聊JDK动态代理原理
    【线性代数】P5 矩阵定义和性质
    光伏发电预测(GRU模型,Python代码)
    Biotin-Cy2 Conjugate,生物素-Cy2 偶联物_Cy2 生物素偶联物
    softmax激活函数
    【Python百日进阶-WEB开发-冲進Flask】Day182 - Flask蓝图与模板继承
    zookeeper mac安装
    文本处理方式方法
    基于Redis的分布式锁安全吗?(上)
    Seata四种事务模式AT、TCC、SAGA 、 XA详解
  • 原文地址:https://blog.csdn.net/qq_46292926/article/details/127568851