[C++](FARPROC&) 的意思是甚麼呢?

在某本書裡面看到它寫
FARPROC addr; 
(FARPROC&) addr = GetProcAddress(...省略...)
要探討這問題,就要先知道一般再宣告的時候,&運算元到底發揮甚麼功用,所以先用最簡單的整數(int)宣告來測試,內容分為以下三種:
int a = b;   //這應該大家都知道,就是把b的值給a
int *a = &b; //程度好一些的應該知道,這是把b的記憶體位址存到a裡面
int &a = b;  //但這個呢?讓我們繼續看下去
要測試程式碼,最簡單的就是直接把程式碼直接去執行!
int b = 2;
int a = b;
a = 2; b = 2; &a = 006FF8C0; &b = 006FF8CC;
//值一樣但記憶體位址不一樣
int b = 3;
int *a = &b;
a = 006FF8B4; b = 3; &a = 006FF8A8; &b = 006FF8B4;
//a存著b的位址,但兩個記憶體位址還是不一樣
int b = 4;
int &a = b;
a = 4; b = 4; &a = 006FF89C; &b = 006FF89C;
//a的位址跟b一樣,所以a跟b一模一樣了!
以這個可以結論出:在宣告的時候 ,int&會把「等號左邊(a)」的變數地址變成「等號右邊(b)」變數的地址,因此a與b兩個是一樣的東西(記憶體位址一樣)!

回到一開始題目問的(FARPROC&) addr 到底是甚麼呢?我還是用程式做一下實驗,先以書上的程式碼為第一個實驗,用(FARPROC&)去接GetProcAddress的值,看會如何;再用addr直接去接,又會如何。以下是結果:
FARPROC addr;
(FARPROC&) addr = GetProcAddress(...);
addr = 74307E60; &addr = 012FFA94; GetProcAddress(...) = 74307E60;
FARPROC addr;
addr = GetProcAddress(...);
addr = 74307E60; &addr = 012FFA88; GetProcAddress(...) = 74307E60;
可以看到其實沒有我們原本在例子「int &a=b;」看到的把addr位址變為GetProcAddress的位址,反而是addr的值變化了,變為GetProcAddress回傳的地址,也就是說(FARPROC&) 在這個實驗中看起來是沒有作用到的。

結論:(FARPROC&) addr 等同於 addr,只是不知道書為何這樣寫。

留言

這個網誌中的熱門文章

[Hyper-V] 讓 Windows 可以吃到超過 16TB 的硬碟!