当前位置:首页 > 内存 > 正文

c语言二维数组在内存中的存放方式

  • 内存
  • 2024-06-05 23:58:18
  • 6467

一、在C语言中,二维数组元素在内存中的存放顺序是A按行存放B按列存放C由用户自己定义D由编译器决定

在C语言中,二维数组元素是逐行存储在内存中的。

二维数组本质上是一个以数组为数组元素的数组,即“数组的数组”,类型说明符数组名[常量表达式][常量表达式]。二维数组在概念上是二维的,这意味着它的索引在两个方向上变化,并且数组中索引变量的位置也在平面上,而不仅仅是像一维数组一样在向量上。

然而,实际的硬件内存是连续访问的,这意味着内存单元在一维上线性排列。一维内存中存储二维数组有两种方式:一种是按行排列,即放置完一行后,依次放置第二行。另一个选项是按列排序,即H。放置一列后,将其插入第二列。在C语言中,二维数组是按行排列的。

例如:float[3][4],b[5][10];将a定义为3*4(3行4列)的数组,b定义为5*10(5行10列)的数组。注意不能写成floata[3,4],b[5,10],而是可以表示为:a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}

高级信息:

1

数组元素也是变量由数组名后跟索引来标识。索引表示数组中元素的序号,数组元素的一般形式为:数组名[索引],其中索引只能是整型常量或整型表达式。如果是十进制数,C编译器会自动四舍五入。例如,a[5]、a[i+j]和a[i++]都是合法的数组元素。数组元素通常称为索引变量。在使用索引变量之前,必须定义一个数组。

2.赋值方法:

初始化赋值的一般形式为:静态类型说明符数组名[常量表达式]={value,value...value};它是一种静态存储类型。C语言规定只能初始化和分配静态内存数组和外部内存数组。{}中的每个数据值是每个元素的初始值,各个值之间用逗号分隔。例如:staticinta[10]={0,1,2,3,4,5,6,7,8,9}对应a[0]=0;a[1]=1...a[;9]=9;

3.使用规则:

1.数组的类型实际上是指数组元素的值类型。对于同一个数组,其所有元素的数据类型都是相同的。

2.数组名的书写规则应与标识符的书写规则相对应。

3.数组名不能与其他变量名相同。

4.您只能为某些元素分配初始值。如果{}中的值的数量小于元素的数量,则仅对元素的第一部分赋值。例子:staticinta[10]={0,1,2,3,4}表示只有a[0]~a[4]这5个元素被赋值,接下来的5个元素自动被赋值0。

5.只能给单个元素赋值,不能给整个数组赋值。例如,如果将值1分配给所有10个元素,则只能写为:staticinta[10]={1,1,1,1,1,1,1,1,1,1,1};:静态inta[10]=1;(请注意:这适用于C和C#语言,但不适用于涉及数组的所有地方。数据库从1开始。)

6.如果数组无法初始化如果指定了初始值,则所有元素的值为0。

7.如果所有元素都被赋值,则不需要在数组描述中指数组元素的数量。例如,staticinta[5]={1,2,3,4,5}可以写成:staticinta[]={1,2,3,4,5};执行程序。这时候就可以用scanf函数的循环语句来给数组元素一一赋值。

参考来源:-二维。大批                   


二、请哪位大虾帮忙回答一下C语言中二维数组是怎么在内存中保存的?像Pascal、C/C++、Java、Ada、Modula-2这样的语言都是main-line(主线,即高维线):
例如:
inta[3][3]=
{
1,2,3,
4,5,6,
7,8,9
};
那么在内存中的存储形式为:
//低地址——→高地址
......1,2,3,4,5,6,7,8,9...
FORTRAN和老版本的VB都使用列优先(column-major,即,column-major,ie,column-major)),刚才的数组在内存中用这种语言表示为:
//低地址——→高地址
......1,4,7,2,5,8,3,6,9...
所以在C/C++中多维数组是以行的形式连续分布在内存中的。下一个例子:
inta[2][2][2];
那么它在内存中的表示是:
a[0][0][0],低地址
a[0][0][1],
a[0][1][0],
a[0][1][1],
a[1][0][0],
a[1][0][1],
a[1][1][0],
a[1][1][1],高地址
具体可以查看:
WriteGreatCode-UnderstandingtheMachine,VolumeI
7.2.2ArrayRepresentationinMemory