基础复习C++程序设计

- 多维数组与指针的关系

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;
- 总结不论是结构体还是类,其中数据变量的存储地址是按照申明的先后地址由低到高,也就是先入后申明的元素(高地址),后入之前申明的元素;

发布了38 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zhiyanzhai563/article/details/68061871