数组(一维数组)

文章介绍了数组的创建规则,包括声明类型和指定大小,强调在C99之前数组大小需为常量。数组初始化的几种方式被详细解释,如未指定大小时默认为初始化值的数量。还讨论了数组在内存中的连续存储和下标从0开始的特性,并通过示例解释了`sizeof`运算符在不同情况下的行为差异。最后,文章提到了二维数组和三子棋游戏的后续话题。
摘要由CSDN通过智能技术生成

数组这个东西好用,但它的规矩挺多的。一不留神就会出错。当时我第一次学习到的时候,只是学到个皮毛没想的那么深,导致后面的学习疑惑很多。下面我就来好好介绍一下它的‘规矩’。

  1. 首先,先讲讲数组是如何创建的。就像变量名一样,你创建一个数组,必须声明它的类型是什么。例:

int arr[n] 

这里面int就是arr数组中存储数据的类型。说明这个arr数组中只能有int型数据,不能有其他的数据。

n表示了你这个数组中存储了多少了int类型的数据。

这里就有需要注意的点了,在例子中arr[n]中的n在C99标准之前数组的创建,[]中不能是变量,要给个常量才行。在C99标准支持了变长数组的概念,数组的大小可以使用变量指定,但是数组不能初始化。

这里我的建议是,一般情况下还是最好不用变量去指定数组大小。

  1. 初始化

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

例:

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";

可以看到这里的初始化千奇百怪,都是对的,那么它们有什么区别呢,我们又该用哪种。

第一个int arr1[10] = {1,2,3},上面我讲到过[10]代表它有十个数据,而这里只有1,2,3。当这种情况的时候,数组会自动把你没有初始化的值自动赋予0.

第二个这里[]中是空的,那是不是错了呢,不是的,在你数组创建的时候是可以不写它的大小,这个时候它的大小就会默认为你{}中的数据个数,这里为4.

第三个就是刚刚好[]中的大小刚好等于{}的数据个数。

第四个这个是char类型的值,它初始化跟int不一样的是它需要给数据加上‘’才行。如果出现数字没加‘’的话,会按照它的ASCII值来换。这里98对应的是b。

第五个和第六个一起说,可以看到第六个是跟之前的很不一样,它是用“”来包含数据的,这跟第五个有啥区别呢,让我们来看看。

可以看到我们arr5在打印完a,b,c之后又打印了一堆东西,而arr6只打印了它本身。

这个的原因就是arr6中“abcdef”这个后面会自动加上\0(字符串终止符),而arr5不会自动加,所以打印的话,会一直打印到找到\0为止。

  1. 使用

创建和初始化完之后,就要使用它的,对于数组的使用我们需要用到一个操作符: [] ,下标引用操作符。它其实就数组访问的操作符。可以发现这跟初始化的arr[]是一样的,但是这完全就是两个东西,只是长的一样而已,初始化用到这个只是规定用这个而已。

我们来看代码:

这里就要说一个知识,数组的下标是从0开始的,第一个数据对应的下标是0,依此类推。

这里我用到了int sz = sizeof(arr) / sizeof(arr[0]);这个使用来统计数组中数据的个数,如果对这个不懂,或者疑惑为什么要这么用的,可以看一下我的这篇文章折半查找,其中有详细的讲解。

这里我没有使用,这样有利于下标的理解。

  1. 存储

说到存储,就得提到地址。地址就是你数据存储的位置。

让我们看看数组中的数据是成什么样分布在我们的内存中的。

已知地址是按照16进制的,这里我们可以看到每个地址比起上一个地址多了4,这是因为int本身就是4个字节。由此可知,我们数组在内存中是连续存放的,随着下标的增长,地址是由低到高的。

如果还有疑惑可以看到:

这里的p是arr的首元素地址,它每次加1(整型,字节大小为4)后的地址,完美符合数组每个数据的地址,说明它们是等价的。也很好的诠释了我们数组在内存中是连续存放的,随着下标的增长,地址是由低到高的。而且相差的大小,就是你数组类型的大小。

这里需要说到一个知识,数组的数组名就是首元素的地址。相信很多同学都知道这个知识点。那么它是绝对的吗,其实不是,它有两种情况下不是等于首元素的地址。相信有些朋友,在上面吃过亏了。

以防有些同学不知道这个,这里来演示一下。

再看看这个如果arr代表的是首元素的地址,这里应该打印的是4,为什么会打印出整个arr的大小呢。

再看看这个,前面两个正常都是加了4(这里怕有同学看不懂16进制,简单讲一下,16进制中c是12,12减去8为4),到了第三个的时候58到80,是28。(2*16+8)最终是差40。又是整个arr的大小

由此可见:

sizeof(数组名),数组名如果单独放在sizeof内部,这里的数组名表示整个数组,计算的是整个数组的大小。(可以看到上面求字符串个数的时候就是用了这个)

&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。

除此之外,遇到的所有的数组名都输数组首元素的地址。

这些就是我对数组的初步了解,后续我会更新二维数组,以及运用它做个小游戏--三子棋。

如果有哪讲的不好或者不对的地方,感谢指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值