关于C语言数组一些基本问题的解释

数组的创建和初始化

1.一维数组创建和初始化
(1)使用变量作为一维数组初始化的长度,也就是所谓的变长数组。

变长数组是在C11标准中才开始使用的,因此不同的编译器对于变长数组有着不同的标准,也就是说,只有在C11标准的编译器下才能使用变长数组。

(2)关于一维数组的初始化
如果要省略数组的长度,就必须在函数的最开始对数组进行初始化,这样子编译器才会给数组一个长度。如果只是省略了数组长度,而不初始化,就无法进行编译。

int arr[] = {1, 2, 3, 4, 5};//right
int arr[];//error

2.二维数组的创建和使用
二维数组的初始化与一维数组是基本相同的,但是有一点要特别注意:
二维数组省略数组长度时,只能省略行标,不能省略列标。如果省略列标的话,会让编译器对于二维数组的默认值无法确定。比如int arr[2][]={1,2,3,4}这样子定义二维数组,编译器不知道应该给一行放多少个元素,就会导致出错。

int arr[3][4] = {1, 2, 3, 4};//right
int arr[][4]={{2, 3} , {4, 5}};//right
int arr[3][]={{1, 2}.{3, 4}.{5, 6}};//error

数组的使用

一维数组和二维数组都可以通过下标进行访问,但是数组的使用最常见的问题就是数组越界。
但是数组越界在编译的时候是无法察觉的,但是在运行的时候就会出问题,得不到我们想要的结果。这个时候我们可以通过调试来找到问题,一般调试的时候出现与某个地址发生冲突的警告,如下图:
在这里插入图片描述
这种情况就属于数组越界,就需要在代码中去找到出错的地方。

数组在内存中的存储

我们应该都知道,一维数组在内存中的存储时连续的,但是二维数组的存储是怎么样的,难道是按照行和列来存储的吗?

通过一张图我们就知道二维数组是怎么存储的:
在这里插入图片描述
二维数组在内存中其实和一维数组一样,也是连续存放的,并且随着下标的增大,地址也是从大到小。

说到这里,又有一个问题:二维数组的首元素地址是什么呢,是第一个元素的地址?还是其他的呢?
我定义了一个三行两列的二维数组,通过将数组首元素地址arr+1,我们看一下结果:
在这里插入图片描述
发现arr+1跳过了8个字节,也就是一行,因此二维数组的首元素地址指的是第一行的地址。

数组名的含义

数组名指的是数组首元素的地址,这个很多人都知道。但是有两个例外:
(1)sizeof(数组名),这里的数组名指的是数组的地址,因此我们可以用sizeof(arr)/sizeof(arr[0])来计算数组长度。
(2)&数组名,这里取出的是整个数组的地址,而不是数组首元素的地址。

除了这两个,其他的任何情况,数组名都指的是数组名,这也就意味着,在将数组作为函数参数进行传递的时候,传递的也是数组首元素的地址,因此在以数组作为参数的函数的内部是不能计算数组的长度的,只能在外面计算好长度之后作为参数进行传递。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值