• 021 指针思考


    /*
    目录:
       一 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原理一模一样。
    */
  • 相关阅读:
    codeforces 820 D. Mister B and PR Shifts(思维)
    codeforces 820 C. Mister B and Boring Game(找规律)
    玲珑杯 1137
    codeforces 817 D. Imbalanced Array(单调栈+思维)
    Atcoder D
    Atcoder C
    Atcode B
    codeforces 816 E. Karen and Supermarket(树形dp)
    codeforces 816 D. Karen and Test(逆元+思维+组合数)
    codeforces 816 C. Karen and Game(模拟+思维)
  • 原文地址:https://www.cnblogs.com/huafan/p/16421854.html
Copyright © 2020-2023  润新知