• C语言——数组详解


    一维数组的创建和初始化

    ##1.1数组的创建
    数组是一组相同类型元素的集合。
    数组的创建方式:

    int arr1[10];
    char arr3[10];
    float arr4[1];
    double arr5[20];
    
    • 1
    • 2
    • 3
    • 4

    错误的初始化

    int count = 10;
    int arr2[count];
    
    • 1
    • 2

    这时数组并不能够成功创建,原因是:数组创建,在C99标准之前, [] 中要给一个常量才可以,不能使用变量。在C99标准支持了变长数
    组的概念,数组的大小可以使用变量指定,但是数组不能初始化。

    1.2 数组的初始化

    数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。
    如:

    int arr1[10] = {1,2,3};//不完全初始化
    int arr2[] = {1,2,3,4};
    int arr3[5] = {12345}char arr4[3] = {'a',98, 'c'};
    char arr5[] = {'a','b','c'};
    char arr6[] = "abcdef";
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。
    主要有以下迭代代码需要注意去分辨:

    char arr1[] = "abc";//注意这个代码中含有'\0'.用strlen求得的长度为4.
    char arr2[3] = {'a','b','c'};//这个代码中不含有'\0',用strlen求得的长度为3.
    
    • 1
    • 2

    1.3 一维数组的使用

    #include 
    int main()
    {
        int arr[10] = { 0 };//数组的不完全初始化
           //计算数组的元素个数
        int sz = sizeof(arr) / sizeof(arr[0]);
        //对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
        int i = 0;//做下标
        for (i = 0; i < 10; i++)
        {
            arr[i] = i;
        }
        //输出数组的内容
        for (i = 0; i < 10; ++i)
        {
            printf("%d ", arr[i]);
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    总结:
    1. 数组是使用下标来访问的,下标是从0开始。
    2. 数组的大小可以通过计算得到。

    int arr[10];
    int sz = sizeof(arr)/sizeof(arr[0]);
    
    • 1
    • 2

    1.4 一维数组在内存中的存储

    #include
    int main()
    {
    	int arr1[10] = { 0 };
    	int i = 0;
    	int sz = sizeof(arr1) / sizeof(arr1[0]);
    	for (i = 0; i <= sz; ++i)
    	{
    		printf("&arr[%d]=%p\n", i, &arr1[i]);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    输出的结果如下:
    在这里插入图片描述
    从得到的结果我们可以看出随着数组下标的增长,数组元素的地址也在有规律的递增,由此我们可以得出一定的结论:数组在内存中是连续存放的。

    二维数组的创建和初始化

    2.1 二维数组的创建

    int arr[3][4];
    char arr[3][5];
    double arr[2][4];
    
    • 1
    • 2
    • 3

    二维数组的初始化

    //数组初始化
    int arr[3][4] = {1,2,3,4};
    int arr[3][4] = {{1,2},{4,5}};
    int arr[][4] = {{2,3},{4,5}};
    
    • 1
    • 2
    • 3
    • 4

    注意:
    二维数组如果有初始化,行可以省略,列不能省略

    2.3 二维数组的使用

    #include 
    int main()
    {
    	int arr[3][4] = { 0 };
    	int i = 0;
    	for (i = 0; i < 3; i++)
    	{
    		int j = 0;
    		for (j = 0; j < 4; j++)
    		{
    			arr[i][j] = i * 4 + j;
    
    		}
    	}
    	for (i = 0; i < 3; i++)
    	{
    		int j = 0;
    		for (j = 0; j < 4; j++)
    		{
    			printf("%d ", arr[i][j]);
    		}
    	}
    	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

    代码结果如下:
    在这里插入图片描述

    2.4 二维数组在内存中的存储

    接下来我们了解一下二维数组的存储方式,代码如下:

    #include
    int main()
    {
    	int arr[3][4] = { 0 };
    	int i = 0;
    	for (i = 0; i < 3; ++i)
    	{
    		int j = 0;
    		for (j = 0; j < 4; ++j)
    		{
    			printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
    		}
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    代码运行结果如下:
    在这里插入图片描述
    在这里插入图片描述
    由此我们也可以得出二维数组也同一维数组一样在内存中也是连续储存的。

    数组越界问题

    数组的下标是有范围限制的。
    数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。
    所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
    C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,
    所以程序员写代码时,最好自己做越界的检查。

  • 相关阅读:
    【蓝桥杯】C++研究生组 每个整装待发的重新开始,都为时不晚!
    分享超高清多机位现场直播间搭建方案
    Java设计模式01- 概览
    【熬夜也要写的文章-银河麒麟V10手动添加显卡的分辨率】
    【比特熊故事汇】6月MVP英雄故事|技术实践碰撞境界思维
    【C语言】深入浅出理解指针及内存与指针的关系(详细讲解+代码展示)
    Elasticsearch7 添加密码验证、并且使用postman访问带密码的es
    react native引用原生组件时无法显示的问题处理
    OSI网络模型与TCP/IP协议
    Vue3 echarts v-show无法重新渲染的问题
  • 原文地址:https://blog.csdn.net/qq_64034271/article/details/126762667