2014-02-09 175 views
1

似乎有 '常量BYTE *' & '常量LPBYTE',當我編譯如下因素代碼(只是一個例子)之間的區別:常量BYTE *和const LPBYTE

void Test(const BYTE * c,const LPBYTE d) { 
c++; // OK 
*c++; // OK 
d++; // ERROR 
*d++; // ERROR 

}

我在Visual Studio中得到了「你不能指定一個常量變量」,我在代碼塊上試過了,並且得到了「只讀參數增量'd'」。我也使用typedef BYTE* bytes,但得到了同樣的錯誤。

那麼這裏發生了什麼,爲什麼我可以修改'c'而不是'd'?

+0

'常量LPBYTE D'和_'you不能分配給一個變量是常量'_這是一個非常明確的信息,那麼你最擔心的是什麼? –

+0

爲什麼它與'c'一起使用,但不與'd'一起使用? – HMVC

+0

'* d ++'嘗試增加'd'的**內容**,而這是禁止的,因爲它聲明瞭'const'! –

回答

6

您應該注意以下兩種數據類型的不同(的「*」確切位置):

char const *variable_1; 
char *const variable_2; 

「variable_1」是一個指向一個只讀字節。但是「variable_1」本身不是隻讀的。

「variable_2」是指向一個字節的只讀指針。但是它指向的字節不是隻讀的。

這意味着:

variable_1 = &xxx; // OK 
variable_2 = &xxx; // Error 
*variable_1 = yyy; // Error 
*variable_2 = yyy; // OK 

現在上述兩種類型的具體含義是下列之一:

const BYTE * == BYTE const * 
const LPBYTE == BYTE * const 
1

const LPBYTE是一個指向字節的常量指針,而不是指向const byte的指針。你只需要知道*位置

+0

確切的定義是['typedef BYTE far * LPBYTE;'](http://msdn.microsoft.com/en-us/library/aa383751%28v=vs.85%29.aspx)和'typedef unsigned char BYTE ;'。但我不明白,這是如何回答OP的問題呢? –

+0

那麼,解決方案是不使用這些將typedef,如果你的意思是const unsigned char *然後寫它! –

+0

@Quest在我問這個問題之前,我做了它,但是我不明白爲什麼「const LPBYTE」不被視爲「const BYTE *」。 – HMVC