zhao4zhong1 (赵中) C语言指针与汇编语言地址
教学计划 第1次课: 演示使用VC2010查看每句C对应的汇编指令和每个C语言成分对应的汇编地址或寄存器。 第2次课: 通过求函数大小功能和求函数调用者实例了解指针与函数对应的汇编内存地址。 第3、4次课: 通过静态和动态一、二、三维数组实例了解指针与数组对应的汇编内存地址。 第5、6次课: 通过带头节点和不带头节点的单链表实例了解指针与单链表对应的汇编内存地址。 第7、8次课: 通过双向链表和双向循环链表实例了解指针与双向链表对应的汇编内存地址。 第9、10次课:通过十字链表实例了解指针与十字链表对应的汇编内存地址。
Alt+8 Alt+6 Alt+5 F11 Ctrl+Alt+M,2 静态和动态三维数组 汇编窗口 内存1 窗口 寄存器窗口 内存2 窗口 单步执行 F11 寄存器窗口 内存2 窗口 Alt+5 Ctrl+Alt+M,2
静态和动态三维数组 鼠标右键点2darray.cpp 、选移除、在弹出的对话框中点移除。 鼠标右键点源文件、添加、现有项、d:\prjzz\prj1\prj1\3darray.cpp、添加 在3darray.cpp上双击鼠标左键 db=(int ***)malloc(2*sizeof(int **)); if (NULL==db) return 1; for (i=0;i<2;i++) { db[i]=(int **)malloc(3*sizeof(int *)); if (NULL==db[i]) return 1; for (j=0;j<3;j++) { db[i][j]=(int *)malloc(4*sizeof(int)); if (NULL==db[i][j]) return 1; } for (k=0;k<4;k++) { db[i][j][k]=i*100+j*10+k; printf(" %3d",db[i][j][k]); printf("\n"); printf("----------------\n"); printf("typeid(db[0][0]).name() is %s\n",typeid(db[0][0]).name()); printf("typeid(db[0] ).name() is %s\n",typeid(db[0] ).name()); printf("typeid(db ).name() is %s\n",typeid(db ).name()); free(db[i][j]); free(db[i]); free(db); return 0; #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <typeinfo.h> int main() { int sa[2][3][4]; int ***db; int i,j,k; for (i=0;i<2;i++) { for (j=0;j<3;j++) { for (k=0;k<4;k++) { sa[i][j][k]=i*100+j*10+k; } printf(" %3d",sa[i][j][k]); printf("\n"); printf("----------------\n"); printf("typeid(sa[0][0]).name() is %s\n",typeid(sa[0][0]).name()); printf("typeid(sa[0] ).name() is %s\n",typeid(sa[0] ).name()); printf("typeid(sa ).name() is %s\n",typeid(sa ).name());
静态三维数组 sa 12ff04 00 ...共96个 sa[0] 00 ...共48个 sa[1] 12ff34 64 ...共48个 typeid(sa[0][0]).name() int [4] //4列 typeid(sa[0] ).name() int [3][4] // 3行4列 typeid(sa ).name() int [2][3][4] //2层3行4列 代码要素 对应内存地址 字节 含义 sa 12ff04 00 ...共96个 静态三维数组sa[2][3][4] sa[0] 00 ...共48个 sa的第0层 sa[1] 12ff34 64 ...共48个 sa的第1层 sa[0][0] 00 ...共16个 sa的第0层第0行 sa[1][2] 12ff54 78 ...共16个 sa的第1层第2行 sa[0][0][0] 00 00 00 00 0,即sa[0][0][0]的值 sa[1][2][3] 12ff60 7b 00 00 00 123,即sa[1][2][3]的值
动态三维数组 db 12ff00 68 2c 38 00 db[0] 382c68 b0 2c 38 00 db[1] 382c6c typeid(db[0][0]).name() int * typeid(db[0] ).name() int ** typeid(db ).name() int *** 代码要素 对应内存地址 字节 含义 db 12ff00 68 2c 38 00 0x382c68,动态三维数组db[2][3][4]的起始地址 db[0] 382c68 b0 2c 38 00 0x382cb0,动态三维数组db[2][3][4]的第0层db[0]的起始地址 db[1] 382c6c e8 2d 38 00 0x382de8,动态三维数组db[2][3][4]的第1层db[1]的起始地址 db[0][0] 382cb0 f8 2c 38 00 0x382cf8,动态三维数组db[2][3][4]的第0层第0行db[0][0]的起始地址 db[1][2] 382df0 d0 2e 38 00 0x382ed0,动态三维数组db[2][3][4]的第1层第2行db[1][2]的起始地址 db[0][0][0] 382cf8 00 00 00 00 0,即db[0][0][0]的值 db[1][2][3] 382edc 7b 00 00 00 123,即db[1][2][3]的值
Thank You!