структура типа указателя или структура, которая является указателем?

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
    Вы должны серьезно прочитать этот вопрос от начала до конца , особенно первый ответ, который просто удивителен.
  • 0
    Я также добавил гр тег , поскольку AFAIK это очень конкретная «проблема» одинакова для обоих языков.
Теги:
arrays
pointers
structure

1 ответ

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

определяет структуру с byte псевдонимов и определяет псевдоним pByte для byte*, так что вы можете использовать его следующим образом:

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);
  • 2
    +1 короткий и прямой. приятное объяснение. Следует отметить, что большинству профессиональных программистов на С не нравятся определения типа указателя, поскольку они, как правило, маскируют внимание, которое звездочки обращают на рецензента. Type *p; объявляет указатель, и это очевидно. TypeP p; ? Хм ... У них, однако, есть одно особое качество. byte* pB, pC; не объявляет два указателя, тогда как pByte pB, pC; делает Однако это не является существенным преимуществом, поскольку первый даже не скомпилируется, если вы попытаетесь использовать pC как указатель. Т.е. вы поймете эту ошибку во время компиляции (обычно).
  • 0
    @WhozCraig: Пока псевдоним каким-то образом несет информацию о том, что это псевдоним для указателя (например, pByte , BytePtr и т. Д.), Я думаю, он все еще в порядке. Иначе это действительно противная штука.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню