带你玩转C语言数组

目录

一 一维数组

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

①定义:

 ②初始化

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

二 二维数组

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

①定义

 ②初始化

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


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

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

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

一 一维数组

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

①定义:

带你玩转C语言数组_第1张图片

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

带你玩转C语言数组_第2张图片

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

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

带你玩转C语言数组_第3张图片

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

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

带你玩转C语言数组_第4张图片

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

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

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

 ②初始化

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

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

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

第一组:整形数组

带你玩转C语言数组_第5张图片

 第二组:字符数组

带你玩转C语言数组_第6张图片

 拓展:带你玩转C语言数组_第7张图片

类似的:

带你玩转C语言数组_第8张图片

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

补充:

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

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

带你玩转C语言数组_第9张图片

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

我们来看一段代码:

带你玩转C语言数组_第10张图片

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

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

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

带你玩转C语言数组_第11张图片

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

#include
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++;
	}
}

 带你玩转C语言数组_第12张图片

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

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

二 二维数组

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

①定义

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

带你玩转C语言数组_第13张图片

 ②初始化

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

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

不完全初始化:

带你玩转C语言数组_第14张图片

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

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

带你玩转C语言数组_第15张图片

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

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

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

带你玩转C语言数组_第16张图片

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

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

带你玩转C语言数组_第17张图片

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

带你玩转C语言数组_第18张图片

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

一维数组:int arr [10]

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

二维数组可以这样理解

带你玩转C语言数组_第19张图片

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

 

你可能感兴趣的:(c语言,算法,数据结构)