2013-10-24 97 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:'*'可以更清楚地传达这些信息。 –