带你玩转C语言数组

目录

一 一维数组

1.一维数组定义与初始化

①定义:

 ②初始化

 2.一维数组在内存中的存储

二 二维数组

1.二维数组的定义与初始化

①定义

 ②初始化

2.二维数组在内存中的存


前言:本篇文章从易到难深入的探讨了数组的相关知识,从数组定义初始化到内存中的存放以及访问数组元素等等,涉及了指针的一些简单应用,本文不对指针做过多解释,在我的其他博客里面有指针详细内容,大家可以先了解一下指针的简单知识以更好的理解本篇的数组知识

数组定义:一组相同类型元素的集合

假如说我们需要创建好几个整形变量,发现需要一个个去创建,每创建一个整形变量就是一条语句,而有了数组之后我们便可以直接把这几个整形数据放在一个数组中即可

一 一维数组

1.一维数组定义与初始化

①定义:

数组定义值得一提的是:数组所含元素个数一般来说必须为常量,不能是变量

 大家会发现,这样定义数组在vs2022编译器下试运行不过去的,像这种数组元素个数是变量的数组我们称为变长数组,而C99语法是支持变长数组的,经测试,gcc编译对C99语法支持的较好

补充:我们来讨论一下数组的数组名代表什么呢?

 我们发现:第一个元素的地址和数组名打印出来一模一样,这就得出了一个重要结论:数组名代表数组首元素的地址

而我们进一步探讨,既然数组名代表了数组首元素的地址,那么&数组名 又是什么含义呢?

 我们惊奇的发现,&数组名与数组名打印出来结果一样

但事实上&数组名取出的是整个数组的地址,而数组名仅仅是数组首元素的地址

而这两个为什么结果一样呢?其实很容易理解

 ②初始化

定义的同时赋初值就叫做初始化

数组元素内容为整形或字符时用花括号{} 引起来

数组元素内容为字符串时候直接用双引号"" 引起来

第一组:整形数组

 第二组:字符数组

 拓展:

类似的:

从上面两个例子可以看出,无论是打印字符串还是求字符串长度,都是以\0作为结束标志的

补充:

[ ] ----下标引用操作符,数组的下标都是从0开始的

数组的大小是可以通过计算得到的

 2.一维数组在内存中的存储

我们来看一段代码:

 观察打印出来的元素地址我们得出两个重要结论:

①数组在内存中是连续存放的

我们知道一个字节对应了一个地址编号,而相邻元素的地址之间差了4个编号,说明差了4个字节,而一个整形刚好占据四个字节空间的大小,那就说明了一维数组在内存中是连续存放的。

而这个结论有何应用呢?既然数组元素连续存放,那么只要我们知道了第一个元素的地址,那就可以很容易访问到数组的所有元素!请看下一段代码

#include<stdio.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	int* p = arr;
	for (i = 0;i < 10;i++)
	{
		printf("%d ", *p);
		p++;
	}
}

 

 由此可见,数组元素的连续存放会让我们轻易的访问到每个元素

②随着下标的增长,元素的地址是由低到高变化的

二 二维数组

1.二维数组的定义与初始化

①定义

比较简单,第一个下标代表行,第二个代表列

 ②初始化

类比一维数组,二维数组的初始化同样包括完全初始化和不完全初始化两种

完全初始化:非常简单,按照行列元素个数摆放即可

不完全初始化:

 二维数组初始化时的省略问题:

行可以省略,列不可以省略

 因为有几行可以根据初始化内容看出来,而一行有几个元素(也就是列数)是没办法确定的

与一维数组类似,二维数组元素也是通过下标去访问的,行列的下标也都是从0开始的

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

通过这段代码打印出了二维数组中的所有元素,我们可以看出二位数组的元素在内存中存放也是连续的。这个连续既指每一行内部元素是连续存放的,而行与行之间也是连续存放的

这就说明其实二位数组在内存中下一行是接着上一行存放的,其实这也就更进一步说明了为什么列不能省略,因为下一行是接着上一行存放的,不知道上一行有几个元素的时候,也就没办法确定下一行应该存放在哪个位置

 同样的,利用连续存放,我们也可以通过第一个元素的地址轻松访问到二维数组的每个元素

最后讲一个重要的对二维数组的理解,将对指针内容的理解更加有帮助

一维数组:int arr [10]

数组名是 arr 只要下标 i 从 0到9变化就可以访问到一维数组数组的每个元素

二维数组可以这样理解

这是非常重要的一点:就是二维数组arr[3][4]里面的每一行的数组名就是arr[0],arr[1],arr[2]等等,这个知识点对于理解指针与二维数组的结合至关重要

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值