基础复习C++程序设计

本文通过实例讲解了多维数组与指针的关系,包括如何使用指针访问数组元素,并探讨了结构体在内存中的分配方式及顺序。通过具体的代码示例,帮助读者理解复杂的内存布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

- 多维数组与指针的关系

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值