【C语言初阶】C语言数组基础:从定义到遍历的全面指南

07-21 1204阅读

📝个人主页🌹:Eternity._

⏩收录专栏⏪:C语言 “ 登神长阶 ”

🤡往期回顾🤡:C语言函数

🌹🌹期待您的关注 🌹🌹

【C语言初阶】C语言数组基础:从定义到遍历的全面指南

【C语言初阶】C语言数组基础:从定义到遍历的全面指南

【C语言初阶】C语言数组基础:从定义到遍历的全面指南

❀数组

  • 📒1. 什么是数组?
    • 🌸数组的特点
    • 🌺数组的应用
    • 📜2. 一维数组
      • 🌈数组的创建
      • 🌞数组的初始化
      • 🌙数组的使用
      • ⭐数组在内存中的存储
      • 📚3. 二维数组
        • 🌈数组的创建
        • 🌞数组的初始化
        • 🌙数组的使用
        • ⭐数组在内存中的存储
        • 📙4. 数组越界
        • 📝5. 数组作为函数参数
          • ⛰️数组作为函数参数错误设计
          • 🏞️数组名
          • 🌄正确设计
          • 📖6. 总结

            🔍前言: 在编程的世界里,数据结构是构建复杂应用程序的基石,而数组则是这些基石中最基础且最不可或缺的一种。C语言,作为一门历史悠久且广泛应用于系统编程、嵌入式开发等领域的编程语言,其数组的概念与操作更是每一位C语言学习者必须掌握的核心技能

            数组,简而言之,是一种连续存储相同类型数据的集合。它允许我们通过索引(或下标)快速访问其中的元素,无论是读取还是修改,都极为高效。C语言中的数组不仅支持一维形式,还可以轻松扩展到多维,为处理复杂数据提供了极大的便利

            本文旨在全面而深入地介绍C语言数组的基本概念、声明与初始化、访问与遍历、以及多维数组的应用等关键内容。通过理论讲解与实例演示相结合的方式,我们将逐步揭开C语言数组的神秘面纱,帮助读者建立扎实的数组知识基础,并掌握在实际编程中灵活应用数组的技巧

            让我们一同踏上这段充满挑战与收获的C语言数组之旅吧!


            📒1. 什么是数组?

            数组(Array)是一种基础的数据结构,用于在计算机内存中连续存储相同类型的数据。它允许通过索引(或下标)来访问这些数据元素,索引通常是从0开始的。数组中的每个元素可以通过计算偏移量来快速定位,这使得数组在访问元素时非常高效


            🌸数组的特点

            • 类型一致性: 数组中的所有元素都必须是相同的数据类型。这意味着,如果你有一个整型数组,那么数组中的所有元素都必须是整数
            • 固定大小: 在大多数编程语言中,数组的大小在声明时就必须确定,并且之后不能改变(尽管有些语言支持动态数组或类似的数据结构,如C++的std::vector或Python的列表,它们提供了动态大小的数组功能)。然而,在C99标准中,C语言引入了变长数组(VLA),其大小可以在运行时确定,但这仍然受到栈大小等限制
            • 索引访问: 数组中的元素可以通过索引来访问,索引通常是从0开始的。例如,在C语言中,如果你有一个名为arr的数组,并且你想要访问它的第一个元素,你可以使用arr[0]
            • 内存连续性: 数组中的元素在内存中是连续存储的。这意味着,如果你知道数组中某个元素的地址,你可以很容易地计算出数组中其他元素的地址

              🌺数组的应用

              • 存储和处理一系列的数据,如学生的成绩、商品的库存量等
              • 作为函数参数传递数据集合
              • 实现算法,如排序、搜索等
              • 字符串处理,因为字符串在C语言中是通过字符数组来实现的
              • 表示多维数据结构,如矩阵和表格

                尽管数组是编程中非常基础且强大的工具,但它们也有一些局限性,比如大小固定(对于传统数组而言)和类型单一。因此,在需要更灵活的数据结构时,程序员可能会选择使用其他数据结构,如链表、树或图等。然而,对于许多常见的编程任务来说,数组仍然是首选的数据结构之一


                📜2. 一维数组

                数组是一组相同类型元素的集合


                🌈数组的创建

                数组的创建方式:

                type_t arr_name [const_n];
                // type_t 是指数组的元素类型
                // const_n 是一个常量表达式,用来指定数组的大小
                

                数组创建代码示例 (C语言):

                //代码1
                int arr1[10];
                //代码2
                int count = 10;
                int arr2[count];
                //代码3
                char arr3[10];
                float arr4[1];
                double arr5[20];
                

                注意:我们来看一下代码二,数组创建,在C99标准之前, [ ] 中要给一个常量才可以,不能使用变量。在C99标准支持了变长数组的概念,数组的大小可以使用变量指定,但是数组不能初始化


                🌞数组的初始化

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


                数组的初始化:

                int arr1[10] = { 1,2,3 };
                int arr2[] = { 1,2,3,4 };
                int arr3[5] = { 1,2,3,4,5 };
                char arr4[3] = { 'a',98, 'c' };
                char arr5[] = { 'a','b','c' };
                char arr6[] = "abcdef";
                

                数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定

                注意:要区分以下这两种数组初始化

                char arr1[] = "abc";
                char arr2[3] = { 'a','b','c' };
                

                🌙数组的使用

                对于数组的使用我们之前介绍了一个操作符: [] ,下标引用操作符。它其实就数组访问的操作符


                数组的使用:

                int main()
                {
                	int arr[10] = { 0 };//数组的不完全初始化
                	//计算数组的元素个数
                	int sz = sizeof(arr) / sizeof(arr[0]);
                	//对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
                	int i = 0;//做下标
                	// for循环遍历数组
                	for (i = 0; i  
                

                通过示例:

                • 数组是使用下标来访问的,下标是从0开始
                • 数组的大小可以通过计算得到
                  int arr[10];
                  int sz = sizeof(arr)/sizeof(arr[0]);
                  

                  【C语言初阶】C语言数组基础:从定义到遍历的全面指南


                  ⭐数组在内存中的存储

                  代码示例 (C语言):

                  int main()
                  {
                  	int arr[10] = { 0 };
                  	int i = 0;
                  	int sz = sizeof(arr) / sizeof(arr[0]);
                  	for (i = 0; i  
                  

                  【C语言初阶】C语言数组基础:从定义到遍历的全面指南

                  注意:仔细观察输出的结果,我们知道,随着数组下标的增长,元素的地址,也在有规律的递增

                  由此可以得出结论:数组在内存中是连续存放的

                  【C语言初阶】C语言数组基础:从定义到遍历的全面指南


                  📚3. 二维数组

                  二维数组(也称为矩阵)是计算机科学中常用的数据结构,用于存储具有两个维度的数据集合。简单来说,它是一个数组的数组,即每个元素本身也是一个数组。二维数组在图像处理、游戏开发、数据分析、科学计算等领域有广泛应用


                  🌈数组的创建

                  数组的创建方式:

                  type_t arr_name [const_n][const_m];
                  // type_t 是指数组的元素类型
                  // const_n 表示行的大小
                  // const_m 表示列的大小
                  //数组创建
                  int arr[3][4];
                  char arr[3][5];
                  double arr[2][4];
                  

                  🌞数组的初始化

                  数组的初始化方式:

                  //数组初始化
                  int arr[3][4] = {1,2,3,4};
                  int arr[3][4] = {{1,2},{4,5}};
                  int arr[][4] = {{2,3},{4,5}};
                  // 二维数组如果有初始化,行可以省略,列不能省略
                  

                  🌙数组的使用

                  二维数组的使用也是通过下标的方式

                  数组的遍历:

                  int main()
                  {
                  	int arr[3][4] = { 0 };
                  	int i = 0;
                  	for (i = 0; i  
                  

                  【C语言初阶】C语言数组基础:从定义到遍历的全面指南


                  ⭐数组在内存中的存储

                  我们来打印以下二维数组的地址看看

                  内存中的存储:

                  int main()
                  {
                  	int arr[3][4];
                  	int i = 0;
                  	for (i = 0; i  
                  

                  【C语言初阶】C语言数组基础:从定义到遍历的全面指南

                  我们可以看出来,其实二维数组在内存中也是连续存储的

                  【C语言初阶】C语言数组基础:从定义到遍历的全面指南


                  📙4. 数组越界

                  数组越界(Array Bounds Violation 或 Index Out of Bounds)是编程中常见的一个错误,主要发生在尝试访问数组时,使用的索引超出了数组的有效范围。在大多数编程语言中,数组索引是从0开始的,因此,对于一个长度为n的数组,有效的索引范围是0到n-1。如果尝试访问索引为n或更大的元素,就会发生数组越界错误


                  数组的下标是有范围限制的

                  数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1

                  所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,

                  所以程序员写代码时,最好自己做越界的检查

                  数组越界:

                  int main()
                  {
                  	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
                  	int i = 0;
                  	for (i = 0; i 
                  		printf("%d\n", arr[i]);//当i等于10的时候,越界访问了
                  	}
                  	return 0;
                  }
                  
                  	int sz = sizeof(arr) / sizeof(arr[0]);//这样对吗?
                  	int i = 0;
                  	for (i = 0; i  
                  

                  此处冒泡排序并不能发挥作用

                  【C语言初阶】C语言数组基础:从定义到遍历的全面指南

                  【C语言初阶】C语言数组基础:从定义到遍历的全面指南

                  注意:数组作为函数参数的时候,并不是把整个数组的传递过去,而是传的是首元素的地址


                  🏞️数组名

                  数组名的含义代码示例 (C语言):

                  int main()
                  {
                  	int arr[10] = { 1,2,3,4,5 };
                  	printf("%p\n", arr);
                  	printf("%p\n", &arr[0]);
                  	printf("%d\n", *arr);
                  	//输出结果
                  	return 0;
                  }
                  

                  【C语言初阶】C语言数组基础:从定义到遍历的全面指南

                  结论: 数组名是数组首元素的地址(有两个例外)

                  数组名是首元素地址,但是计算大小不适用

                  int arr[10] = {0};
                  printf("%d\n", sizeof(arr)); // 40
                  

                  两个例外:

                  • sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组
                  • &数组名,取出的是数组的地址。&数组名,数组名表示整个数组

                    🌄正确设计

                    void bubble_sort(int arr[], int sz)//参数接收数组元素个数
                    {
                    	int i = 0;
                    	for (i = 0; i  arr[j + 1])
                    			{
                    				int tmp = arr[j];
                    				arr[j] = arr[j + 1];
                    				arr[j + 1] = tmp;
                    			}
                    		}
                    	}
                    }
                    int main()
                    {
                    	int arr[] = {3,1,7,5,8,9,0,2,4,6};
                    	int sz = sizeof(arr)/sizeof(arr[0]);
                    	// 我们先计算好数组的大小
                    	bubble_sort(arr, sz);
                    	for(int i=0; i  
                    

                    📖6. 总结

                    在探索C语言数组的旅程即将结束之际,我们不禁要回顾这一路上所见的风景与收获。数组,作为C语言乃至众多编程语言中的基石之一,其重要性不言而喻。它不仅是我们存储和操作一系列相同类型数据的高效工具,更是构建复杂数据结构(如矩阵、字符串等)的基础

                    通过本文的介绍,我们深入了解了C语言数组的定义、初始化、访问以及通过循环遍历数组的方法。我们见证了数组如何帮助解决一系列实际问题,从简单的数学计算到复杂的数据处理,数组都以其独特的方式展现出了其强大的功能性和灵活性

                    然而,正如任何强大的工具一样,数组的使用也需要谨慎。越界访问、内存泄漏等问题是我们在使用数组时不得不面对的挑战。因此,掌握良好的编程习惯,如在使用前检查数组边界、合理管理内存等,对于避免潜在的问题至关重要

                    让我们在掌握C语言函数的基础上,继续保持对编程的热情与好奇心,勇于探索未知,不断挑战自我!!!

                    【C语言初阶】C语言数组基础:从定义到遍历的全面指南

                    希望本文能够为你提供有益的参考和启示,让我们一起在编程的道路上不断前行!

                    谢谢大家支持本篇到这里就结束了,祝大家天天开心!

                    【C语言初阶】C语言数组基础:从定义到遍历的全面指南

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]