C语言-数组

C语言-数组,第1张

文章目录
  • 一、一维数组
    • 1、一维数组创建
    • 2、一维数组初始化
    • 3、一维数组的使用
    • 4、一维数组在内存中的存储
  • 二、二维数组
    • 1、二维数组的创建
    • 2、二维数组的初始化
    • 3、二维数组是如何使用的
    • 4、二维数组在内存中的存储方式
    • 5、对于二维数组的理解
  • 三、数组越界
  • 四、数组作为函数参数
    • 1、数组名是什么?
    • 2、冒泡排序
  • 五、数组的应用
    • 1、三子棋
    • 2、扫雷

一、一维数组 1、一维数组创建

数组元素的数据类型+数组名+[常量表达式]
对于中括号的内容:
常量表达式用来表示数组的大小,指定数组当中有多少个元素。
表示数组的大小任何时候都可以用常量或者常量表达式。
在C99标准之前,只能用常量或者常量1表达式
在C99标准之后,可以用1变量表示数组的大小,用来表示变长数组,变长数组的意思是可以用变量来表示数组的长度。

2、一维数组初始化

当指定元素个数时:
分为不完全初始化和完全初始化
当不完全初始化时,由于指定了元素的个数,剩余的元素默认为0。
当完全初始化时,按顺序存入就行了。
当不指定元素个数时:
数组会根据初始化的内容,确定元素的个数。
例子:

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

数组会根据初始化的内容,确定元素的个数,数组arr1的元素的个数是3,
数组的元素的个数是4。
arr2存放的是字符串,字符串末尾有\0,\0在内存中也会占用空间,所以arr2中的元素个数是4。

3、一维数组的使用

使用之前应了解数组是如何在内存中存储的:
数组在内存中是连续存放的,在内存中申请空间,在栈中存取,数组中的元素按顺序排列。
想象成在一层楼中,许多个房间按顺序排列,并且每个房间都有编号。
数组中的元素同样也有编号,每个元素都对应着下标,从0开始。

使用下标引用 *** 作符,获取下标,来定位元素。

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

一维数组在内存中是连续存放,
是因为有两点原因:
第一点:如果数组中存放的是整型元素,则相邻的元素的第一个字节对应的地址都相差4。
第二点:随着元素的下标增长,地址编号也在有规律的增长。
综上两点可以说,一维数组在内存中是连续存取的。
对于第一点,每个整型元素在内存中占用四个字节,一个字节对于一个地址编号,而通过在控制台打印数组中每个元素的地址发现,下标为0的元素的地址和下标为1的元素的地址恰恰相差为4,并且看其他元素的地址都是相差4,也就是说,这些元素是挨着的,是放在一起存放的。
对于第二点,由于都是相差4,随着下标的增长,所以地址也在有规律的增加。

二、二维数组 1、二维数组的创建

创建二维数组的原因:
我们现在想存几组相同类型的元素,一维数组只能存取一组相同类型的元素,所以就会产生二维数组。
例如:
1234
4567
0987
我们想要存上面几组的元素,都是整型,并且我们想要存三行,一行有四个数据,所以有三行四列。
此时二维数组可以这样创建:int arr[3][4]

2、二维数组的初始化

初始化的意思是在创建数组的时候,给数组一些合理的初始值。

初始化的方式:

在创建数组时,已经给数组指定好元素个数:

当对对初始化的数据不分组时,数据足够时,按照指定的有几行,一行应存取多少数据,一个一个存取。
当对对初始化的数据不分组时,数据不足够时,按照指定的有几行,一行应存取多少数据,一个一个存取,如果数据用完,使用默认为0的数据进行补充。
当对初始化的数据分组时,数据足够时,就没有区别了。
当对初始化的数据分组时,数据不足够,一组占一行,如果一组当中初始化的数据,不能够按照指定的一行有几列进行存取,则使用默认为0的数据进行补充。
例:int arr[3][4] = { {12),{45},{89});
此时已经分好组了,一组占一行,但指定一行需要放四个元素,则使用默认为0的元素进行补充。

在创建数组时,没有给数组指定好元素个数:

当不指定有多少行的时候,指定了一行有多少列:

编译器会根据一行有多少列,知道应该如何存取数据。
当按照指定的一行应存取多少数据,存取之后,会自动换行,继续存取剩余的。
例如:int arr[][4] = { 12344567890},编译器知道一行应该存取四个数据,放完四个之后,会自动换行,继续放,直到数据存完。

当不指定列的时候,指定了有多少行:
只是指定有多少行,编译器是不知道怎么存取数据的,它不知道一行应该存取多少数据。
例如:int arr[3][ ]= { {12},{3456} },当编译器在第一行放完1和2之后,由于不知道这一行应该存取几个数据,就会报错。

综上所述,二维数组不能不指定一行有多少列,也就是不能不指定二维数组的列数。

3、二维数组是如何使用的

二维数组也是通过访问下标,来定位元素的。
一维数组是确定房间的编号,也就是使用每一个元素所对应的下标,来定位元素的。
此时一维数组是一层楼房,那么二维数组是多层楼房,首先应先确定层数,在确定房间编号,使用每一个元素所对应的下标,来定位元素。
所以说,二维数组是对行和列进行编号,从0开始,通过确定行和列的下标,定位元素。

4、二维数组在内存中的存储方式

二维数组在内存中也是连续存放的
为什么说也是连续存放的?
以整型数组为例:
通过在控制台打印二维数组的每个元素的地址发现,和一维数组的元素的地址的特点一样,相邻两个元素的地址都是相差4
,所以在二维数组也是在内存中连续存放的,并不是以行和列的方式存放。
总结:
二维数组和一维数组在内存中的布局方式是一样的,但是访问的形式不一样。

5、对于二维数组的理解

第一个理解:
可以把二维数组看作一维数组:
将二维数组的每一行作为元素,那么此时二维数组就是一维数组。
第二个理解:
可以把二维数组看做一维数组的数组:
先把二维数组看作一维数组,
把每一行看作一维数组的元素,
再把这每一个元素看作一个一维数组,
所以二维数组可以理解为一维数组的数组。
每一行看作一个元素,一个元素可以看作一个一维数组,假如有三行,就有三个元素,就有三个一维数组。
将这每一行看作一维数组之后呢:
arr[0]是第一行这个一维数组的数组名,
arr[1]是第二行这个一维数组的数组名,
arr[1]是第三行这个一维数组的数组名,
在通过使用列的编号,可以定位每一行每一列的元素。

比方说要访问第一行的每一个数据,使用arr[0][j],访问 联想一维数组访问元素时,使用arr[j],访问
所以就可以把arr[0],看做每一行的数组名。

三、数组越界

什么是数组越界:
当访问元素时,由于下标和房子的编号是一个道理,都是有范围的,如果使用不在下标范围内的下标去访问元素,就是数组越界,就会出现数组越界。
但出现数组越界,编译器并不会报错,需要自己细心检查。
对于在一维数组里面去访问元素时:
当访问每一个元素时,如果此时的下标的范围是0-9,使用下标为10时,就会出现越界访问。
对于在二维数组去访问元素时:
当分别访问每一行的每一列的元素时,如果每次在访问某一行的元素的时候,都会额外访问到下一行的元素,这只是在自己范围内越界,并不会出错,但如果一直这样下去,到最后一行的时候,照样会额外访问,但此时已经是最后一行了,所以就会出现越界访问。
所以二维数组也有可能出现越界访问。

四、数组作为函数参数 1、数组名是什么?

数组名是首元素的地址 (arr)
但是有两个例外,数组名代表整个数组
第一个例外:使用数组名求数组的长度,求出来的是整个数组的长度:sizeof(arr)
第二个例外:使用数组名求数组的地址,求出来的是代表第一个元素的地址,但表示的是,整个数组的地址,&arr。
arr的数组长度是10*4=40个字节,占有40个地址编号,一个字节占一个地址编号,一个整型占四个字节,一个整型占四个地址编号。
深刻理解&arr和&arr[0]的区别:
通过使他们的地址分别+1,来看他们最后跳到哪去了,就可以表示出他们分别代表什么?
&arr[0]+1之后,跳到下一个元素的第一个字节的地址,表示出&arr[0],代表一个元素的地址。尽管在控制台输出的是第一个字节的地址,这是以少概全。为了方便,仅使用第一个字节代表整个元素的地址。

&arr + 1之后,越过了整个数组的地址编号,跳到与数组紧挨着的一个字节的地址编号,表示出&arr,代表一个数组的地址,尽管在控制台输出的是第一个字节的地址,这里也是以少概全,为了方便,仅使用第一个字节代表整个数组的地址。

举例来说:

2、冒泡排序

冒泡排序的规则是:两个相邻的元素的进行比较,如果比较出来的大小不满足我们的排序,就进行调整
我对于冒泡排序的理解就是:一群人站一排,有的人不惨,有的人有一点惨,有的人很惨,惨的程度不一样,每个人站的位置也是残次不齐,比如说现在要求最惨的人应该站在最右边,然后队列中,两个相邻的人就互相比惨,惨的一方往右边移,进行完所以的比较之后,最惨的人已经站在了最右边,在进行比较的时候,就不需要在比较他了。这样比较下来,这几次比较下来,称为一趟冒泡排序,可以明白,一趟冒泡排序,可以分出一个最惨的人,假设一个队中有10个人,那么需要进行9趟冒泡排序。
一趟冒泡排序,进行多次比较,第一趟冒泡排序,进行9对的比较,第二趟进行8对的比较

五、数组的应用 1、三子棋 2、扫雷

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1353825.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-14
下一篇2022-06-14

发表评论

登录后才能评论

评论列表(0条)

    保存