【问题标题】:structure of pointer type or a structure which is a pointer?指针类型的结构还是指针结构?
【发布时间】:2013-10-24 19:35:06
【问题描述】:

我正在准备考试,我遇到了这个声明。我已经阅读了几本书和笔记,到目前为止我还没有遇到过这个,我什至不知道该怎么称呼它,所以我无法找到答案。

来了。

 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
 }
}

再次,如果我不知道一些基本的东西......好吧,我不知道,因为我还在学习:) 请帮帮我。谢谢。

【问题讨论】:

  • 你真的应该read this question from beginning to end,尤其是第一个答案,这简直太棒了。
  • 我还添加了 c 标签,因为 AFAIK 这个非常具体的“问题”对于两种语言都是一样的。

标签: c++ c arrays pointers structure


【解决方案1】:
typedef struct {
    ...
} byte, *pByte;

定义了一个别名为byte 的结构,并为byte* 定义了一个别名pByte,所以 您可以通过以下方式使用它:

byte b;
pByte pB = &b;

也相当于:

byte b;
byte* pB = &b;

所以如果你有一个void 指针x(这有点可疑,如果可能的话你应该尽量避免首先使用void*)并且你知道它指向第一个元素n 结构的数组:

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

然后

temp = p[i];

是可能的并且等价于(指针算术):

temp = *(p + i);

【讨论】:

  • +1 短而直接。很好的解释。应该注意的是,大多数专业的 C 程序员喜欢指针类型定义,因为它们倾向于掩盖星号给审阅者带来的当面关注。 Type *p; 声明了一个指针,这很明显。 TypeP p; ?嗯……但是,它们确实具有一种特殊的品质。 byte* pB, pC; 没有声明两个指针,而 pByte pB, pC; 声明了。然而,这并不是一个实质性的收获,因为如果您尝试像指针一样使用pC,前者甚至不会编译。 IE。你会在编译时发现这个错误(通常)。
  • @WhozCraig:只要别名以某种方式携带它是指针别名的信息(即pByteBytePtr 等),我想它仍然可以。否则,这确实是一件令人讨厌的事情。
  • @KeithThompson:确实如此。我只是说一旦有人决定为指针创建别名,他至少应该在其名称中明确表达这一事实。
猜你喜欢
  • 2013-12-13
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多