数组(C语言)

数组:一组具有相同类型数据的集合。

1、 一维数组的创建

一维数组的定义方式:type_t  arr_name[ count ];

                                   //type_t 数组元素的类型

                                  //arr_name 数组名

                                  //count 数组元素的个数,是一个常量表达式

   eg: int arr1[10];

        float arr2[20];

        double arr3[30];

注意:(1)、数组名的命名规则和变量名的命名规则相同;

           (2)、[ ] 中必须是常量,不可以是变量

             eg:int count = 10;

                  int arr4[count];    //在这里,count为整型变量,故数组创建失败。

2、一维数组的初始化

   初始化方式:

  (1)、定义数组时对数组全部元素赋予初值;

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

  (2)、定义数组时只对一部分元素赋予初值;

       eg: int arr2[10] = { 0, 1, 2, 3 };   //数组有10个元素,前四个元素赋予了初值,其余元素值为 0

   (3)、若初始数组元素都为 0

       eg: int arr3[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

             int arr4[10] = { 0 };        //以上两种均可实现,但一般情况下,我们会使用后一个定义方式。

    (4)、对全部元素赋予初值,可不定义数组大小

      eg: int arr5[ ] = { 0, 1, 2, 3, 4}; //数组有5个元素

   注意:在定义字符串时

            数组(C语言)

3、一维数组的使用

   C语言规定只能逐个引用数组元素,不可以一次引用整个数组

   使用形式:arr_name [ n ] ;

         eg: int arr1[ 5 ] = { 0, 1, 2, 3, 4};

               t = arr1[3];   //此时 t = 3;表示取数组中下标为3 的元素,数组中第一个元素的下标为 0 ,以此类推。

   注意: 数组的大小可通过计算得到

              int arr2[ ] ={ 0, 1, 2, 3, 4};

              int sz = sizeof(arr2) / sizeof(arr2[0]);

4、一维数组在内存中的存储

          代码                                                                                       结果

          数组(C语言)

   结论:数组在内存中是连续存放的

5、指针的初识

     因在下面的内容中涉及到使用指针访问数组的知方法,故在这里大致描述一下指针。

    首先,看一下内存的编址:

                 数组(C语言)

   (1)、内存中的每个内存单元对应一个地址;

   (2)、在 32 位平台上指针的大小为 4 个字节,在 64 位平台上指针的大小为 8 个字节。

      指针变量指存放一个地址的变量。

           eg:int n = 10;

                int *p = &n;    //指针变量 p 存放的是 n 的地址

               *p = 20;   //所改变实质上是 n 的值

6、一维数组的指针访问    

  (1)       代码                                                                                结果

              数组(C语言)

      结论:数组名就是数组首元素的地址

    (2)       代码                                                                                       结果

             数组(C语言)

      结论:数组名+整数 i 运算 = 数组下标为 i 的地址

7、二维数组的创建

     与一维数组的创建类似;

     eg: int arr1[3][4];

           double arr2[ ][4];   // 行可以省略,列不可以省略

8、二维数组的初始化

     与一维数组的初始化类似;

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

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

           int arr3[3][4] = { { 3 }, { 5 }, { 9 } };

           int arr4[3][4] = { { 3 }, { 0, 5 },{ 0, 0, 9}};

9、二维数组的使用

          与一维数组一样使用下标引用;

         使用形式:arr_name[ i ][ j ];   //指下标为(i,j)的元素

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

                      printf("%d\n",arr1[2][1]);        //输出的值为10

10、二维数组在内存中的存储

                       代码                                                                        结果

                   数组(C语言)

               结论:二维数组在内存中的存储也是连续的

11、二维数组的指针访问

  (1)      代码                                                                                                                             结果

                 数组(C语言)

           结论:数组名就是数组首元素的地址。

   (2)         代码                                                                                                                             结果

                   数组(C语言)

           结论:数组名+整数4* i +j 运算 = 数组下标为 ( i , j) 的地址

12、有关数组的运算

     (1)、一维数组

                   数组(C语言)

               注:*&a 相当于 a

     (2)、字符数组

                    代码                                                                                           结果

                   数组(C语言)

                   数组(C语言)

              注:strlen()函数是用来求一个字符串长度的。因为arr的结尾不是'\0',strlen()会继续向后检索,直到遇到'\0',而这些区域的内容是不确定的,故输出的结果中不确定返回多少。

                        代码                                                                                        结果

                   数组(C语言)

                   数组(C语言)

                   代码                                                                                    结果

                   数组(C语言)

                   数组(C语言)

 

     (3)、二维数组

                  数组(C语言)

    总结:sizeof(数组名):这里的数组名表示整个数组;

               & 数组名 :这里的数组也表示整个数组。

13、数组作为函数参数

      在写代码时,在数组作为参数的时候,实际上只是把数组首元素的地址传了过去,不会把整个数组传过去。

    eg: void Max(int arr1[ ])

          {       

                  int sz = sizeof(arr1) / sizeof(arr1[0]);             

          }

   分析:在上面这个例子中,int arr1[ ]表示一个指针,即 int *arr1;

             所以我们会得到 sz = 1;而不能表示整个数组元素的个数。

             往往我们在使用数组作为参数的时候,会选择把数组大小的相关内容传过去(比如直接传过去数组元素的个数 或者 传过去左右下标,用左右下标控制位置)。