C语言中二维数组在内存中的存放顺序是什么

嘿,咱们聊聊C语言里的二维数组,这玩意儿在内存里的存法挺有意思的。
说起来,我记得最早接触这东西是2 005 年,那时候还不太懂。
不过现在给你一讲,就明白了。

你看,像int a[3 ][4 ]这种数组,它里面的元素是按照行优先顺序存储的。
就是先存第一行的元素,再存第二行,一直这么顺序来。
就像a[0][0]、a[0][1 ]这些,然后是a[0][2 ]、a[0][3 ],接下来是第二行的a[1 ][0]、a[1 ][1 ]等等。

这个存储方式保证了内存的连续性。
比如说,a[3 ][4 ]这个1 2 个元素的数组,它在内存里是紧挨着排列的,中间没有间隔。
要是有4 个字节一个int的话,整个数组就得占用4 8 个字节。

然后呢,你要想知道数组里某个元素在内存里的地址,也有个公式。
就是基地址加上(i乘以列数加上j)乘以元素的大小。
比如,要找a[1 ][2 ]这个元素的地址,假设int占4 字节,地址就等于基地址加上(1 乘以4 加上2 )乘以4 ,结果是基地址加上2 4
说到这里,你得知道,C语言是按照行优先存储的,这和像Fortran那种先存储一列再存储下一列的方法是不一样的。
在C语言里,这样存储的好处是访问效率更高,缓存利用率也更好。

记得有一次,我用这个知识写了一个成绩统计程序,用的是inta[5 ][3 ]这个数组,用来存5 个学生的3 门课程成绩。
写程序的时候,我用外层循环来控制科目(就是行),内层循环来控制学生(就是列),这样数据就能高效地按行存储了。
当时我还挺得意呢,结果如果反过来写(先控制列,再控制行),那内存访问就会变得很频繁,程序性能可就差远了。

说实话,我现在回想起那时候,我当时的想法也挺简单的,就是想着怎么让程序跑得快一点。
现在想想,这种按行优先存储的原理还是挺有用的,挺能解决实际问题啊。

求教c语言二维数组的冒泡排序法?

直接说:用VS创建Win3 2 程序写冒泡排序。

stdio.h头文件导入。
main函数写上。

准备个乱序整数数组。
比如{5 ,3 ,8 ,4 ,1 }。

变量声明:比如int i,j,临时变量temp。

双for循环搞定。

外循环控制趟数。
内循环比较相邻。

对,就是这个问题。
之前遇到过。

C语言|二维数组的定义、初始化、赋值

二维数组是行和列的矩阵结构。
C语言中二维数组按行存储。
a[3 ][4 ]占用1 2 个int元素,共4 8 字节。
实例:5 人3 科成绩存a[5 ][3 ]。
初始化可分行赋值或连续赋值。
部分赋值时未指定元素为0。
可省略第一维长度若全部赋值。
二维数组是嵌套一维数组。
a[2 ][3 ]分解为a[0], a[1 ], a[2 ]三个一维数组。
你自己掂量。

C语言|二维数组的定义、初始化、赋值

等等,昨天我还在想那个超市的货架,一排排的,突然想到这二维数组不也像货架上的商品,一行行摆着。
我顺手翻了翻书,书上写着,在咱们电脑里,这些货架上摆的东西,其实是挨着放的,就像仓库里叠放箱子一样。

我试着在纸上画了画,一个3 行4 列的数组,就是3 个4 商品的货架。
定义的时候,先说数据类型,比如int,就是货架上都是数字商品。
然后说货架的名字,比如a,看着像超市代码。
再写上两行数字,3 和4 ,这就是货架有3 排,每排4 个格子。

初始化的时候,就像第一天开超市,把每个货架上放好东西。
按行放,就是先放第一排,再放第二排,每个格子放什么数字,一行行写清楚。
或者一口气把所有商品都放上,就像把所有格子填满。
要是只放了一部分,没放的地方就空着,系统会自动放个0进去,就像没卖出去的货,仓库里放着。

赋值的时候,就像后来进货,某个格子放错了,可以直接改。
或者,就像每天盘点,知道第i排第j个格子该放多少,就用循环一个个去改。
反正这货架上的东西,怎么放怎么改,都挺有意思的。

等等,还有个事,我昨天看那个程序员,他写代码的时候,旁边贴着张纸,写着每个数组代表什么,突然想到,要是超市货架也贴个标签,是不是就更好懂了?