0%

[C++] (FARPROC&) 的含意

前言

在加密與解密一書中看到這樣的寫法

1
2
FARPROC addr; 
(FARPROC&) addr = GetProcAddress(...省略...)

平常只會看到像是 (int)(int*) 之類的轉型,第一次看到轉型是帶著 & 符號的,引發我的好奇心,藉此研究一番。

探討

要探討這問題,就要先知道一般再宣告的時候,& 運算元到底發揮甚麼功用,所以先用最簡單的整數(int)宣告來測試,內容分為以下三種:

  1. int a = b; //這應該大家都知道,就是把b的值給a

    1
    2
    3
    4
    int b = 2;
    int a = b;
    //結果:a = 2; b = 2; &a = 006FF8C0; &b = 006FF8CC;
    //結論:值一樣但記憶體位址不一樣
  2. int *a = &b; //程度好一些的應該知道,這是把b的記憶體位址存到a裡面

    1
    2
    3
    4
    int b = 3;
    int *a = &b;
    //結果:a = 006FF8B4; b = 3; &a = 006FF8A8; &b = 006FF8B4;
    //結論:a存著b的位址,但兩個記憶體位址還是不一樣
  3. int &a = b; //但這個呢?讓我們繼續看下去

    1
    2
    3
    4
    int b = 4;
    int &a = b;
    //結果:a = 4; b = 4; &a = 006FF89C; &b = 006FF89C;
    //結論:a的位址跟b一樣,所以a跟b一模一樣了!

以這些實驗可以得到結論:在宣告的時候 ,int& 會把「等號左邊(a)的變數地址」改變成「等號右邊(b)變數的地址」,因此 ab 兩個是一樣的東西(也就是記憶體位址一樣)!

回到最一開始的問題:(FARPROC&) addr 到底是甚麼呢?我還是用程式做一下實驗,先以書上的程式碼為第一個實驗,用 (FARPROC&) 去接 GetProcAddress 的值,看會如何;再用 addr 直接去接,又會如何。以下是實驗結果:

1
2
3
FARPROC addr;
(FARPROC&) addr = GetProcAddress(...);
//結果:addr = 74307E60; &addr = 012FFA94; GetProcAddress(...) = 74307E60;
1
2
3
FARPROC addr;
addr = GetProcAddress(...);
//結果:addr = 74307E60; &addr = 012FFA88; GetProcAddress(...) = 74307E60;

可以發現其實沒有像是我們在最原本例子 int &a=b; 看到的把 addr 位址變為 GetProcAddress 的位址,反而是addr的值變化了,變為 GetProcAddress 回傳的地址,也就是說 (FARPROC&) 在這個實驗中看起來是沒有作用到的。

結論

(FARPROC&) addr = GetProcAddress(...) 等同於 addr = GetProcAddress(...),只是不知道書上為何多此一舉。

很高興能在這裡幫助到您,歡迎登入 Liker 為我鼓掌 5 次,或者成為我的讚賞公民,鼓勵我繼續創造優質文章。
以最優質的內容回應您的鼓勵