2013-10-24 172 views
0

我正在學習考試,我遇到了這個聲明。我已經閱讀了幾本書和筆記,到目前爲止我還沒有遇到這個問題,我甚至不知道該怎麼稱呼它,所以我一直無法找到答案。指針類型的結構或指針的結構?

在這裏。

typedef struct { 
     unsigned a: 4; 
     unsigned b: 4; 
} byte, *pByte;// what does *pbyte means here? 

int main(){ 
pByte p = (pByte)x; // this is typecasting void pointer. how does it work with *pbyte 
byte temp; 
unsigned i; 

for(i = 0u; i < n; i++) { 
     temp = p[i]; //again I have no idea why we suddenly have array 
} 
} 

再次,如果我不知道基本的東西......以及我不知道原因即時通訊仍在學習:)請幫我。謝謝。

+0

你真的應該[從頭到尾閱讀這個問題](http://stackoverflow.com/questions/5727/what-are-the-barriers-to-understanding-pointers-and-what-c​​an-be-done-克服困難),特別是第一個答案,這簡直太神奇了。 – WhozCraig

+0

我還添加了[tag:c]標籤,因爲AFAIK這個非常具體的「問題」對於兩種語言都是一樣的。 – LihO

回答

1
typedef struct { 
    ... 
} byte, *pByte; 

限定結構用別名byte並限定一個別名pByte用於byte*一樣,所以 可以使用它通過以下方式:

byte b; 
pByte pB = &b; 

這也等價於:

byte b; 
byte* pB = &b; 

所以萬一你h AVE一個void指針x(這是一個有點可疑,如果可能的話,你應該儘量避免在首位使用void*),你知道它指向的n結構數組的第一個元素:

pByte p = (pByte) x;   // casts x back to the correct type 
byte temp; 

然後

temp = p[i]; 

是可能的和等效於(指針運算):

temp = *(p + i); 
+2

+1短而直接。很好的解釋。應該指出的是,大多數專業C程序員不喜歡指針類型定義,因爲它們往往掩蓋了星號給評論者帶來的面部注意。 '鍵入* p;'聲明一個指針,並且它很明顯。 'TypeP p;'?呃...他們確實有一個特定的質量。 'byte * pB,pC;'不聲明兩個指針,而'pByte pB,pC;'*確實*。然而,這並不是一個實質性的收益,因爲如果你嘗試像指針一樣使用'pC',前者甚至不會編譯。即你會在編譯時(通常)發現錯誤。 – WhozCraig

+0

@WhozCraig:只要別名以某種方式攜帶它作爲指針別名的信息(即'pByte','BytePtr'等等),我想它仍然沒問題。否則,這確實是一件令人討厭的事情。 – LihO

+0

@LihO:'*'可以更清楚地傳達這些信息。 –