2015-01-08 3 views
-1
typedef struct person *person_t; 

В этом случае, что такое person_t точно? это указатель на человека или человека? В C++, если бы я был объявить PTR к объекту, я хотел бы сделать:Синтаксис Си о typedef struct pointer, необходимо описание

person* p; 

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

person_t p? 

Спасибо.

+1

Это плохой typedef. Вы должны использовать 'typedef struct person person_t;'. Для типа указателя вы должны использовать что-то в строках 'typedef struct person * person_ptr;'. –

ответ

2

person_t является struct person *

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

person_t p; 

Когда вы

typedef struct person *person_t; 
person_t p; 

p является указателем на структуру struct person

Else, если у вас есть

typedef struct person person_t; 

Тогда

person_t *p; 

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

PS:Я всегда хожу на второй тот, который я чувствую себя более читаемым и менее запутанным. (Purely IMO)

0

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

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

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

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

Вы можете передать этот link.

0

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

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_ptr, или что-то еще, что будет видно, что этот тип обозначает указатель.

+0

Подождите, часть, которая меня смущает больше всего, стоит ли использовать person_t * p2 или person_t p2, мы все еще держим звезду? – ohshire

+0

@ohshire Вы определили в typedef person_t как struct person *. Поэтому они взаимозаменяемы. Если вы напишете person_t *, то это будет эквивалентно struct person **, то есть будет указателем на указатель. –