Синтаксис C об указателе структуры typedef, требуется объяснение

typedef struct person *person_t;

В данном случае, что такое person_t? это указатель на человека или человека? В C++, если бы мне нужно было объявить указатель на объект, я бы сделал:

person* p;

В данном случае означает ли это, что я могу просто написать:

person_t p?

Спасибо.


person ohshire    schedule 08.01.2015    source источник
comment
Это плохой typedef. Вы должны использовать typedef struct person person_t;. Для типа указателя вы должны использовать что-то вроде строк typedef struct person* person_ptr;.   -  person R Sahu    schedule 08.01.2015


Ответы (3)


person_t is struct person *

Таким образом, вы можете просто иметь

person_t p;

Когда вы делаете

typedef struct person *person_t;
person_t p;

p — указатель на структуру struct person

В противном случае, если у вас есть

typedef struct person person_t;

затем

person_t *p;

даст вам указатель на вашу структуру, которая p

PS: Я всегда предпочитаю последний вариант, который мне кажется более читабельным и менее запутанным. (Чисто ИМО)

person Gopi    schedule 08.01.2015

Это действует как указатель на структуру.

 struct person *p; // is equivalent to person_t p;

Потому что вы также вводите указатель.

 person_t p; // it  will act like a pointer to  structure.

Вы можете обратиться по этой ссылке.

person Karthikeyan.R.S    schedule 08.01.2015

Эта декларация

typedef struct person *person_t;

вводит псевдоним person_t для типа struct person *. Таким образом, вы можете использовать person_t или struct person * взаимозаменяемо. Например, эти два объявления эквивалентны

struct person *p1;
person_t *p2;

Проблема в том, что использование идентификатора person_t для обозначения указателя типа struct person * — не лучший выбор. Читатель кода может подумать, что person_t — это псевдоним самой структуры person. Было бы лучше например объявить псевдоним указателя типа person_ptr или что-то другое, что бы было видно, что этот тип обозначает указатель.

person Vlad from Moscow    schedule 08.01.2015
comment
Подождите, больше всего меня смущает то, использовать ли person_t *p2 или person_t p2, мы все еще сохраняем звезду? - person ohshire; 09.01.2015
comment
@ohshire Вы определили в typedef person_t как struct person *. Так что они взаимозаменяемы. Если вы напишете person_t *, то это будет эквивалентно struct person **, то есть это будет указатель на указатель. - person Vlad from Moscow; 09.01.2015