zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【C语言】数组的基本知识详细讲解(一维数组、二维数组、越界、存储.....

2023-04-18 15:50:13 时间

接着上次的操作符的详解,让我们来简单了解C语言里的数组。

目录

一维数组的创建和初始化

一维数组的使用

一维数组的存储

二维数组的创建与初始化 

二维数组的存储

 数组的越界

总结 


  • 一维数组的创建和初始化

1.数组的创建

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

2.数组创建方式 :

type_t(数组类型) arr_name(数组名) [const_n](用来指定数组大小)

3.数组的初始化

数组的初始化是在其定义的时候就应该执行的,如:为5个已经知道的整形数据进行排序

//正确
int Arr[5] = { 1, 2, 3, 4, 5 };
//而不能用下面这种方式
int Arr[5];
Arr[5] = { 1, 2, 3, 4, 5 };

因为对于 Arr[5] = 来说,这是一个赋值操作,将右值赋值给左值,一切常数、字符和字符串都是右值。在这里 { 1, 2, 3, 4, 5 }; 并不是右值的一种,所以这是错误的。
另一个错误是,Arr[5] 下标为 5 这个元素实际上并不存在的属于数组的越界

有数字类型的初始化,自然也有字符类型的初始化

字符类型初始化的两种方式:

char arr[5]={'a','b','c','d','e'};
char arr[5]= "abcde ";

1.空字符是字符串的终止符(空字符本身不是字符串的一部分,所以字符串的长度并不包含空字符)

2.操作字符串时,必须保证字符串以空字符()结尾(不以空字符结尾的字符序列,不是字符串)。


  • 一维数组的使用

1.例

用单引号形式初始化的数组代表只有这些数据,并且在末端不包含

总结

  1. 数组是使用下标来访问的,下标是从0开始。
  2. 数组的大小可以通过计算得到。
  3. Int sz = sizeof(arr)/sizeof(arr[0])

  • 一维数组的存储

当我们定义了长度为5的整型数组,操作系统就会为其分配连续的五个内存地址。
这些地址用来存放数据,每一个地址所占的字节是数组的数据类型所决定的。
如int类型的每一个地址占据着4个字节,double类型的8个。

因为每个整形大小为四个字节,所以如图每个地址间隔为4。


讲完了一维数组的知识点,让我们简单了解一下二维数组

  • 二维数组的创建与初始化 

      1.二维数组的创建

       第一个括号指定行,第二个括号指定列

       可以只对部分元素赋值,未赋值的元素自动取“零”值。例如:

       int arr[3][4]={1,2,3,4,5}

        2.二维数组的初始化

        第一行:123 第二行:45

        二维数组的列不能省略行可以在括号内大括号分割明确时省略


  • 二维数组的存储

        1.二维数组在内存中的存储

        如果定义一个这样的二维数组int a[3][4]={undefined{1,3,5,7},{9,11,13,15},{17,19,21,23}};则其在内存中的表示可能下面这样的。

由上图可以看出,在内存中二维数组是按照行主序进行存储的,从内存的角度上看,二维数组本质就是一个一维数组。如果把二维数组的每一行看成一个整体,即看成一个数组中的一个元素,那么整个二维数组就是一个一维数组。而二维数组的名字代表二维数组第0行的首地址(注意它是代表一行元素的首地址,而不是第0行第0列元素的首地址,虽然是相等的,但不能这么理解,所以在没有强制转换的情况下,二维数据要么通过行指针进行参数传递,要么通过二维指针进行参数传递)。 


  •  数组的越界

这里讲的数组长度存在一个界,而一旦超过了这个大小,就会发生一些未知的错误,也就是所谓的越界
这里用一个例子来说明下越界后数组内部的值的情况:

根据代码可知,当数组越界后,其数值是不确定的。


  • 总结 

        以上就是初阶数组的基本内容。如果你读到了这里,非常感谢你能看完的文章!!!

        如果你觉得你有些想法和我一样,想和我一起提升自己可以关注私信我,与我一起进步,一起共同努力!!!!!