Ответы:
Он позволяет передавать массив в функцию по значению или получать его по значению, возвращаемому функцией.
Структуры можно передавать по значению, в отличие от массивов, которые в этих контекстах распадаются на указатель.
Еще одно преимущество состоит в том, что он абстрагирует размер, поэтому вам не нужно использовать [MAX]
весь код везде, где вы объявляете такой объект. Этого также можно добиться с помощью
typedef char ABC[MAX];
но тогда у вас есть гораздо более серьезная проблема: вы должны знать, что ABC
это тип массива (даже если вы не видите этого, когда объявляете переменные типа ABC
), иначе вы будете ужалены тем фактом, что это ABC
будет означать что-то другое в списке аргументов функции по сравнению с объявлением / определением переменной.
Еще одно преимущество состоит в том, что структура позволяет вам позже при необходимости добавлять дополнительные элементы без необходимости переписывать много кода.
Вы можете скопировать структуру и вернуть структуру из функции.
Вы не можете сделать это с массивом - если он не является частью структуры!
Вы можете скопировать это так.
struct ABC a, b;
........
a = b;
Для массива вам нужно будет использовать функцию memcpy или цикл для назначения каждого элемента.
Вы можете использовать структуру для создания нового типа данных, например строки . вы можете определить:
struct String {
char Char[MAX];
};
или вы можете создать список данных, которые вы можете использовать в качестве аргумента функций или вернуть в своих методах. Структура более гибкая, чем массив, потому что она может поддерживать некоторые операторы, такие как =, и вы можете определять в ней некоторые методы.
Надеюсь, это будет полезно для вас :)
Еще одно преимущество использования такого типа struct
заключается в том, что он обеспечивает безопасность типов везде, где struct
он используется; особенно если у вас есть два типа, состоящих из массивов одинакового размера, используемых для разных целей, эти типы помогут вам избежать случайного использования массива ненадлежащим образом.
Если вы не оборачиваете массив в a struct
, вы все равно можете объявить typedef
для него a : это имеет некоторые из преимуществ: struct
• тип объявляется один раз, • размер автоматически корректируется, • смысл кода становится более ясным, • а код более удобен в обслуживании, но вы теряете ◦ строгую безопасность типов, ◦ возможность копировать и возвращать значения типа и ◦ возможность добавлять элементы позже, не нарушая остальной код. Два typedef
s для пустых массивов данного типа дают разные типы, только если они имеют разные размеры. Более того, если вы используете typedef
без *
аргумента функции, это эквивалентно char *
значительному снижению безопасности типов.
В итоге :
typedef struct A_s_s { char m[113]; } A_s_t; // Full type safey, assignable
typedef char A_c_t[113]; // Partial type-safety, not assignable
A_s_t v_s(void); // Allowed
A_c_t v_c(void); // Forbidden
void s__v(A_s_t); // Type-safe, pass by value
void sP_v(A_s_t *); // Type-safe
void c__v(A_c_t); // UNSAFE, just means char * (GRRR!)
void cP_v(A_c_t *); // SEMI-safe, accepts any array of 113
Структура может содержать функции инициализации массива, копирования и завершения, имитирующие некоторые преимущества парадигм управления памятью ООП. Фактически, очень легко расширить эту концепцию, чтобы написать универсальную утилиту управления памятью (используя структуру sizeof (), чтобы точно знать, сколько байтов обрабатывается) для управления любой структурой, определяемой пользователем. Многие интеллектуальные производственные кодовые базы, написанные на C, интенсивно используют их и обычно никогда не используют массив, если его область действия не является очень локальной.
Фактически, для массива, встроенного в структуру, вы могли бы делать другие «умные вещи», такие как проверка привязки, в любое время, когда вы хотели получить доступ к этому массиву. Опять же, если объем массива не очень ограничен, использовать его и передавать информацию между программами - плохая идея. Рано или поздно вы столкнетесь с ошибками, которые не дадут вам уснуть по ночам и испортят ваши выходные.
struct
содержащий только массив.