前言
在加密與解密一書中看到這樣的寫法
1 | FARPROC addr; |
平常只會看到像是 (int)
、(int*)
之類的轉型,第一次看到轉型是帶著 &
符號的,引發我的好奇心,藉此研究一番。
探討
要探討這問題,就要先知道一般再宣告的時候,&
運算元到底發揮甚麼功用,所以先用最簡單的整數(int
)宣告來測試,內容分為以下三種:
int a = b; //這應該大家都知道,就是把b的值給a
1
2
3
4int b = 2;
int a = b;
//結果:a = 2; b = 2; &a = 006FF8C0; &b = 006FF8CC;
//結論:值一樣但記憶體位址不一樣int *a = &b; //程度好一些的應該知道,這是把b的記憶體位址存到a裡面
1
2
3
4int b = 3;
int *a = &b;
//結果:a = 006FF8B4; b = 3; &a = 006FF8A8; &b = 006FF8B4;
//結論:a存著b的位址,但兩個記憶體位址還是不一樣int &a = b; //但這個呢?讓我們繼續看下去
1
2
3
4int 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
直接去接,又會如何。以下是實驗結果:
1 | FARPROC addr; |
1 | FARPROC addr; |
可以發現其實沒有像是我們在最原本例子 int &a=b;
看到的把 addr
位址變為 GetProcAddress
的位址,反而是addr的值變化了,變為 GetProcAddress
回傳的地址,也就是說 (FARPROC&)
在這個實驗中看起來是沒有作用到的。
結論
(FARPROC&) addr = GetProcAddress(...)
等同於 addr = GetProcAddress(...)
,只是不知道書上為何多此一舉。