/* 目录: 一 C原理 二 汇编原理 */
一 C原理
void change(int** p2)
{
printf("p2 = 0x%x, *p2 = 0x%x/n", p2, *p2);
printf("*p2 = 0x%x, *8p2 = %d/n", *p2, **p2);
}
int main()
{
int i = 3;
printf("&i = 0x%x, i = %d/n", &i, i);
int *p = &i;
printf("p = 0x%x, *p = %d, &p = 0x%x/n", p, *p, &p);
change(&p);
return 0;
}
/*
// result
&i = 0x293cfba4, i = 3
p = 0x293cfba4, *p = 3, &p = 0x293cfbc8
p2 = 0x293cfbc8, *p2 = 0x293cfba4
*p2 = 0x293cfba4, *8p2 = 3
*/
/*
内存: 数值; 地址(数值所在的内存单元编号)。
方法:
(1) &p: 取该p变量的地址。
(2) *p: 把p当做某个地址看。
取该p地址里面的值。
思考:
1 *P: 得到数值可能是数值或指针。
2 为什么可以跨函数修改数值内容,因为传递的是内存地址,不受函数作用域影响。
*/
二 汇编原理
; 汇编
void change(int** p2)
{
printf("p2 = 0x%x, *p2 = 0x%x/n", p2, *p2);
00007FF623E224FF mov rax,qword ptr [p2]
00007FF623E22506 mov r8,qword ptr [rax] ; 数值: *p2
00007FF623E22509 mov rdx,qword ptr [p2] ; 数值: p2
00007FF623E22510 lea rcx,[string "p2 = 0x%x, *p2 = 0x%x/n" (07FF623E2BC10h)]
00007FF623E22517 call printf (07FF623E2124Eh)
printf("*p2 = 0x%x, *8p2 = %d/n", *p2, **p2);
00007FF623E2251C mov rax,qword ptr [p2]
00007FF623E22523 mov rax,qword ptr [rax]
00007FF623E22526 mov r8d,dword ptr [rax] ; 数值: **p2
00007FF623E22529 mov rax,qword ptr [p2]
00007FF623E22530 mov rdx,qword ptr [rax] ; 数值: *p2
00007FF623E22533 lea rcx,[string "*p2 = 0x%x, *8p2 = %d/n" (07FF623E2BCE0h)]
00007FF623E2253A call printf (07FF623E2124Eh)
}
int main()
{
int i = 3;
00007FF623E2211D mov dword ptr [i],3
printf("&i = 0x%x, i = %d/n", &i, i);
00007FF623E22124 mov r8d,dword ptr [i] ; 数值: i
00007FF623E22128 lea rdx,[i] ; 数值: &i
00007FF623E2212C lea rcx,[string "&i = 0x%x, i = %d/n" (07FF623E2BCF8h)]
00007FF623E22133 call printf (07FF623E2124Eh)
int *p = &i;
00007FF623E22138 lea rax,[i] ; 数值: &i
00007FF623E2213C mov qword ptr [p],rax ; 数值: p = &i
printf("p = 0x%x, *p = %d, &p = 0x%x/n", p, *p, &p);
00007FF623E22140 lea r9,[p] ; 数值: &p
00007FF623E22144 mov rax,qword ptr [p] ;
00007FF623E22148 mov r8d,dword ptr [rax] ; 数值: *p
00007FF623E2214B mov rdx,qword ptr [p] ; 数值: p
00007FF623E2214F lea rcx,[string "p = 0x%x, *p = %d, &p = 0x%x/n" (07FF623E2BD10h)]
00007FF623E22156 call printf (07FF623E2124Eh)
change(&p);
00007FF623E2215B lea rcx,[p] ; 数值: &p
00007FF623E2215F call change (07FF623E21532h)
return 0;
00007FF623E22164 xor eax,eax
}
/* 分析: 查看汇编指令和上面C原理一模一样。 */
原创文章,作者:dweifng,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/270676.html