cc++深入探讨数组内存模型

cc++深入探讨数组内存模型,第1张

cc++深入探讨数组内存模型,第2张

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

的。
比如:
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代表了系统中一个4byte的内存区域,编译时候用a来代表内存的值[也就是所谓右值],array来代表一段(4*10)byte内存区域的值,而具体到array这个变量的身上,编译器解释他的时候,把它看成是这段内存的首地址。所以上面的程序段中的那个printf打印出来的因该是'a的值, array第一个元素的值,array的首地址'。基于以上的一些事实和理论,
int *p=array;
int **p1=&array;
p和p1从他们的值上面来说,他们是一样的,都是array元素的首地址,他们的不同在于他们的语义上的区别,
*p=array;//一个指向了数组的指针
int **p1=&array;//一个指向了‘指向数组的指针‘得指针。
语义上的不同,对于编译器来解释这个变量的行为的时候非常重要,但是对于系统的内部来说,基本的内存的结构一样的,我们如果能抓住这点的话,那么,指针对我来说将是透明的。
下面举个例子:
int array[10];
int array2d[10];
这两个数组的区别和联系分别是什么,如果你能很清楚地认识到那么,你已经有不错的功力了。
首先,不同点,
最表面的语义上的不同就是一个是1维,一个是二维,
for(int i=0;i

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

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情