2012-04-05 2 views
4

Пожалуйста, помогите мне определить части этого typdef и то, что каждая часть делает, и как он может быть использован:Идентификация частей этой структуры typedef в C?

typedef struct my_struct 
{ 
     int a; 
     int b; 
     int c; 
} struct_int, *p_s; 

struct_int struct_array[5]; 

То, что я думаю, что они, Pleae исправить, если неправильно:

  1. typedef struct является создание новый тип.
  2. my_struct - это имя этого типа, но не используется в остальной части кода.
  3. struct_int - это один из примеров того типа, который мы можем использовать в коде.
  4. *p_s - указатель конкретно на тот экземпляр, который мы создали.
  5. struct_array - массив экземпляра, который мы создали. (Эта часть меня смущает, так как мы уже создали экземпляр ...)

Кроме того, при создании массива структур, почему мы используем struct_int вместо my_struct?

+7

Мы обычно любим _helping_ людей с домашним заданием; Я боюсь, что это приближается к вашей домашней работе. Можете ли вы заполнить то, что ваши _guesses_ для разных частей? – sarnold

+1

уверен, пожалуйста, держите ... –

+0

@sarnold: приятное резюме ......... –

ответ

3

typedef struct создает новый тип.

The typedef является определение struct_int и p_s, которые являются синонимом struct my_struct и struct my_struct* соответственно. Идея состоит в том, чтобы избавить вас от необходимости вводить вещи в длинный путь и улучшать читаемость (что не всегда так).

my_struct - это имя этого типа, но не используется в остальной части кода.

Потому что вы должны использовать my_struct в struct my_struct, но вы typedef «d struct_int обратиться к этому типу, и это проще.

struct_int - это один из примеров того типа, который мы можем использовать в коде.

Нет, прочитайте выше. Если вы удалили typedef, то у вас будет создавать две переменные struct_int и p_s.

*p_s - указатель конкретно на тот экземпляр, который мы создали.

Нет, прочитайте выше.

struct_array - массив экземпляра, который мы создали. (Эта часть меня смущает, так как мы уже создали экземпляр ...)

struct_array представляет собой массив типа struct_int, поэтому это массив типа struct my_struct. No Экземпляр создан в определении вашего struct.

Кроме того, при создании массива структур, почему мы используем struct_int вместо my_struct?

То же, что и один из вопросов выше; вы можете использовать struct my_struct или struct_int, struct_int короче, и это победит цель typedef ing struct_int.

+0

приятно объяснил, большое вам спасибо. –

4

struct my_struct - это имя типа, my_struct - это имя тега, а не тип.

typedef не создает типы в C, но создает псевдонимы для существующих типов.

+0

создает псевдоним - это часть, которую мне не хватало, спасибо –

3

Не совсем! Вот что означает другая часть:

struct my_struct: Здесь вы создаете новый тип данных, который вы будете называть struct my_struct всякий раз, когда вы хотите создать новый экземпляр объекта. Например, вы должны сказать: struct my_struct a; и неmy_struct a;

typedef struct my_struct {} struct_int;: Здесь вы просто создать псевдоним для struct my_struct и назовите его struct_int. С этого момента, можно сказать struct_int a; вместо struct my_struct a;

typedef struct my_struct {} *p_s; Здесь можно создать новый псевдоним для типа данных, который указывает на struct my_struct. Вы можете использовать его следующим образом: p_s newStruct = malloc(sizeof(struct_int));

+0

@sarnold Спасибо – GradGuy

2

my_struct - это название этого типа конструкции. Впоследствии он может быть использован для объявления других структур этого типа.

struct_int - имя псевдонима, созданного typedef.

*p_s является указателем на структуру типа my_struct (aka struct_int). Он может указывать на структуру этого типа.

struct_array - это имя массива my_struct s. Однако, поскольку он объявлен с псевдонимом struct_int, мы должны называть его позже как один.

Использование псевдонима является личным предпочтением, действительно один или другой из my_struct или struct_int может быть удален.

1

Ваши предположения отчасти верны. Я хотел бы пойти в 3 и 4.

Если вы удалили typedef и было это:

struct my_struct { 
    // ... 
} struct_int_v, *p_s_v; 

Тогда вы бы объявили две переменные struct_int_v и p_s_v с типами вы ожидали (один - struct my_struct, а другой struct my_struct*).

Однако при введении stroage спецификаторtypedef вы говорите C, чтобы не создать переменную, но тип, в то время как синтаксис декларации идентичны.

Таким образом, struct_int будет типа, что переменная struct_int_v будет иметь и p_s будет тип, переменная struct_int_v будет иметь.

Обратите внимание, что спецификаторы хранения как typedef (или static в этом отношении), применяются ко всем переменным (в то время как другие, такие как, например, классификаторы const или volatile применяются к типам в отличии) до ;.

+0

«вы говорите C, чтобы не создавать переменную, а тип, в то время как синтаксис объявления идентичен». - Не знаю, спасибо, –

1

Вы в основном ответили на свой вопрос, так что я буду решать две оставшиеся точки, которые я вижу:

Во-первых, название типа, который создает struct определение struct my_struct. Вы можете объявлять переменные как

struct my_struct a; 
struct my_struct b; 

, но вы не хотите, чтобы написать struct все время, так что вы создать псевдоним с помощью typedef. Это может быть немного понятнее, чтобы определить структуру и псевдонимы отдельно:

struct my_struct { 
    int a, b, c; 
}; 
typedef struct my_struct struct_int; 
typedef struct my_struct *p_s; 

Это первый определяет тип, который называется struct my_struct, затем определяет struct_int как псевдоним типа struct my_struct, затем определяет p_s как псевдоним типа struct my_struct *. В коде, который вы написали, все три вещи объединены в один, но это означает одно и то же.

Во-вторых, псевдоним типа p_s не имеет ничего общего с массивом struct_array. *p_s не определяет экземпляр структуры, потому что он является частью typedef: вместо этого он определяет псевдоним типа. Но даже если бы не было typedef, а p_s были, следовательно, фактической переменной указателя, массив, определенный впоследствии, является отдельной и несвязанной переменной.

+0

Мне нравится, как вы сделали его более чистым ... –

+1

При использовании 'typedef' для создания удобных псевдонимов для типов структуры обычно опускать название структуры целиком:' typedef struct {/ * .. . * /} my_struct_type; '. Нет смысла иметь два разных имени для одного и того же. – Wyzard

+1

Вы также можете напрямую создавать экземпляры анонимных структур: 'struct {int a, b; } my_two_ints; '. Поскольку нет 'typedef', это определяет действительную переменную. – Wyzard

Смежные вопросы