本文共 2967 字,大约阅读时间需要 9 分钟。
static short A[4];
第i个元素的地址计算公式为 (&A[0]+i*2)movw (%edx,%ecx,2),%ax
ECX是变址寄存器在main函数之前定义,分配在静态区,链接后会在可执行目标文件数据段(后续介绍)中分配空间
编译器通常将数组的地址放在EDX中
实现sum+和i++:
addl (%edx,%ecx,4),%eaxaddl $1,%ecx
局部变量分配在栈中,数组首地址通过EBP定位
对buf初始化的指令:将立即数赋值给寄存器所指的内存单元
实例:计算矩阵乘积
#includeusing namespace std;void give_v(int* ptr);int single_num(int i, int j);const int a = 3;int b1[a][a];int b2[a][a];int result[a][a];int main() { cout << "Please make sure your matrix:" << endl; give_v(b1[0]); give_v(b2[0]); for (int i = 0; i < a; i++) { for (int j = 0; j < a; j++) { cout << single_num(i, j)<<'\t'; } cout << endl; } return 0;}void give_v(int* ptr) { for (int i = 0; i < a; i++) { for (int j = 0; j < a; j++) { cin >> *(ptr + i * a + j); } } return;}int single_num(int i, int j) { result[i][j] = 0; for (int x = 0; x < a; x++) { result[i][j] += b1[i][x] * b2[x][j]; } return result[i][j];}
在数据类型匹配的情况下,数组和指针在一定意义上具有等价性。
int a[10];int *ptr=a[0];int a[10],*ptr;ptr=&a[0];
a的值就是数组的首地址
ptr=a 注意:指针运算会进行相应的收缩 ptr+i不代表直接加i,而是ptr+4*iint *a[10];
#includeusing namespace std;int main() { int a[][4] = { { 1,2,3,4}, { 3,4,5,6} }; int* ptr[] = { a[1],a[2] }; int sum = 0; for (int i = 0; i < 2; i++) { for (int j = 0; j < 4; j++) { sum += *(a[i] + j); } } cout << sum; return 0;}
struct rect{ long llx; long lly; unsigned long width; unsigned long height; unsigned color;}struct rect r;//声明一个struct rect类型的变量r,struct和rect不可分割r.llx=r.lly=0;r.width=10;//设置r的相关属性struct rect q={ 0,0,10,20,0xFF00FF};//声明的同时赋值long area(struct rect *rp){ return (*rp).width*(*rp).height;}//struct指针//用rp->width代表(*rp).width
(*stu_info_ptr).name
可以写成stu_info_ptr->name
由于我还没有系统学过算法,这里的知识都比较简单。参考博客https://blog.csdn.net/zhanggonglalala/article/details/79738213
struct Node{ int data; struct Node *pleft; struct Node *pright;}Node;
data表示本节点存储的值,另外两个结构体是左孩子节点的指针和右孩子节点的指针。
long trace(tree_ptr tptr){ long result=0; if(*tptr==0){ return result;} while(*tptr!=0){ result=val; tptr=tptr->left; } return val;}
最左边叶子的变量值