- 多维数组与指针的关系
1.1 实例表达
int x2d[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 如下对应的是多维数组和指针的关系;
引用块内容 表示形式 含义
x2d, &x2d[0] 二维数组名表示指向0行的指针; x2d[0],*(x2d+0),*x2d,&x2d[0][0] 指向二维数组第0行第0列元素的指针;
x2d+i , &x2d[i] 指向二维数组第i行的指针
x2d[i]+j, *(x2d+i)+j , &x2d[i][j] 指向二维数组第i行第j列元素的指针;
(x2d[i]+j), (*(x2d+i)+j) , x2d[i][j] 二维数组第i行第j列元素的值
1.2. 测试样例
int x2d[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
cout<<*(*(&x2d[0]+1)+1)< <endl;
//输出确实为6,证明对x2d[0]取地址的的数据类型还是数组指针;
2. 结构体的内存分配
2.1 实例测试
struct ANode{
int a;
int b;
};
struct BNode{
ANode A;
int c;
};
struct CNode{
BNode c;
int d;
};
CNode p;
BNode*bnode=&p.c;
00899418 lea eax,[ebp-18h]
0089941B mov dword ptr [ebp-24h],eax
ANode*anode=&p.c.A;
0089941E lea eax,[ebp-18h]
00899421 mov dword ptr [ebp-30h],eax
int *a=&p.c.A.a;
00899424 lea eax,[ebp-18h]
00899427 mov dword ptr [ebp-3Ch],eax
int*b=&p.c.A.b;
0089942A lea eax,[ebp-14h]
0089942D mov dword ptr [ebp-48h],eax
int*c=&p.c.c;
00899430 lea eax,[ebp-10h]
00899433 mov dword ptr [ebp-54h],eax
int*d=&p.d;
00899436 lea eax,[ebp-0Ch]
00899439 mov dword ptr [ebp-60h],eax
}
2.2 解释:
在堆栈中分布变量从高地址到低地址分布的,EBP指向栈底指针,ESP指向栈顶指针,根据stdcall调用约定,参数从右向左入栈;
所以有;
anode为ebp-30 ebp为栈底指针为高地址;
如上是在debug里面调试的代码的;
运行过程可以看出整型的大小12
从高地址到低地址的顺序;dcba
从低地址到高地址;abcd
首先入栈的是高地址d;
- 总结不论是结构体还是类,其中数据变量的存储地址是按照申明的先后地址由低到高,也就是先入后申明的元素(高地址),后入之前申明的元素;