全国计算机等级考试二级:cc++深入探讨数组内存模型

全国计算机等级考试二级:cc++深入探讨数组内存模型,第1张

全国计算机等级考试二级:cc++深入探讨数组内存模型,第2张

对于一个好学的人来说,写一本书,他做什么并不重要。关键是他为什么这么做。只有深入到这一步,他才敢说‘啊,我懂了’。所以,如果他以后遇到类似的问题,也能从我们知道的原理中推导出正确的结果,从容自信。而好学的人,往往注定会迷茫一阵子,花太多的时间试图解决这种迷茫。可想而知其中的艰辛,因为我就是这样走过来的。所以一直想写一个关于指针、数组、地址、左右值等等语言学习中最困惑的问题。然而,由于时间有限,我没能完成这个想法。今天,我太忙了,无法把我想说的话完整地写出来。所以,我就走个捷径,抛开c++/C的语义,从系统底层的原理来解决网民的问题。我水平不高,应该抛砖引玉。

【注意以下解释均以32位系统为例,即一个int占用4个字节】
问题:

1.多维数组传值
我知道二维数组传值func(type [][SIZE]),但是三维数组呢?3维以上?

如果你使用类似上面的方法,你在函数中得到的是用const修饰的,这意味着你不能改变数组中的值。
如果用指针写的话,我知道二维func(type** array),但是数组不能直接定义为array[][],所以用循环比较麻烦。
超过3维怎么办?如何定义数组?

2.什么函数可以有效地将数组复制出来?否则,我们将不得不再次回收。

首先说一下c/c++对数组变量的解释。我们知道,虽然变量的语言解释是对某段内存的‘标识’,但编译器对不同类型变量的使用和解释是不同的。
例如:
void main()
{
int a = 0;
int array[10];
a = 3;//ok
array[0]= 4;//ok
array={1,2,4 };//error
printf("%d,%d,%d ",a,array[0],array);//ok
return;
}
对于上面的程序段,A代表系统中一个4字节的内存区域。编译时,A表示内存的值[所谓的右值],array表示一个(4*10)字节内存区域的值。至于变量数组,编译器把它解释为这个内存的第一个地址。所以上面程序段打印的printf应该是‘a的值,数组第一个元素的值,数组的第一个地址’。基于以上事实和理论,
int * p = array;
int * * P1 = & array;

p和p1的值是相同的。它们是数组元素的第一个地址。它们的不同在于它们的语义不同:
* p = array;//指向数组的指针
int * * P1 = & array;//指向“指向数组的指针”的指针。

语义上的差异对于编译器解释这个变量的行为非常重要,但是对于系统内部来说,基本的内存结构是一样的。如果能抓住这一点,那么指针对我来说就是透明的。
这里有个例子:
int array[10];
int array 2d[3][10];
这两个数组有什么区别和联系?如果你能清楚地认出它们,你就已经有一项好技能了。

  首先,不同点,最表面的语义上的不同就是一个是1维,一个是二维,
for(int i=0;i

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 全国计算机等级考试二级:cc++深入探讨数组内存模型

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情