Respuestas:
Le permite pasar la matriz a una función por valor, u obtenerla devuelta por valor de una función.
Las estructuras se pueden pasar por valor, a diferencia de las matrices que decaen a un puntero en estos contextos.
Otra ventaja es que abstrae el tamaño para que no tenga que usar [MAX]
todo su código donde quiera que declare dicho objeto. Esto también podría lograrse con
typedef char ABC[MAX];
pero entonces tienes un problema mucho más grande: debes tener en cuenta que ABC
es un tipo de matriz (aunque no puedas ver esto cuando declaras variables de tipo ABC
) o de lo contrario te picará el hecho de que ABC
significará algo diferente en una lista de argumentos de función versus en una declaración / definición de variable.
Una ventaja más es que la estructura le permite agregar más elementos si es necesario, sin tener que volver a escribir mucho código.
Puede copiar una estructura y devolver una estructura desde una función.
No puede hacer eso con una matriz, ¡a menos que sea parte de una estructura!
Puedes copiarlo así.
struct ABC a, b;
........
a = b;
Para una matriz, necesitaría usar la función memcpy o un bucle para asignar cada elemento.
Puede usar struct para crear un nuevo tipo de datos como una cadena . puedes definir:
struct String {
char Char[MAX];
};
o puede crear una Lista de datos que puede usar por argumento de funciones o devolverla en sus métodos. La estructura es más flexible que una matriz, porque puede admitir algunos operadores como = y puede definir algunos métodos en ella.
Espero que sea útil para ti :)
Otra ventaja de usar tal struct
es que hace cumplir la seguridad de tipo dondequiera que struct
se use; especialmente si tiene dos tipos que consisten en matrices del mismo tamaño utilizadas para diferentes propósitos, estos tipos lo ayudarán a evitar el uso accidental de una matriz de manera inapropiada.
Si no ajusta una matriz en a struct
, aún puede declarar un typedef
para ello: esto tiene algunas de las ventajas de struct
: • el tipo se declara una vez, • el tamaño es automáticamente correcto, • la intención del código se vuelve más clara, • y el código es más fácil de mantener, pero pierde ◦ seguridad de tipo estricta, ◦ la capacidad de copiar y devolver valores del tipo y ◦ la capacidad de agregar miembros más tarde sin romper el resto de su código. Dos typedef
s para matrices desnudas de un tipo dado solo producen diferentes tipos si son de diferentes tamaños. Además, si usa el typedef
sin *
en un argumento de función, es equivalente a char *
reducir drásticamente la seguridad de tipos.
En resumen :
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
Una estructura puede contener funciones de inicialización de matriz, copia y fini que emulan algunas de las ventajas de los paradigmas de administración de memoria OOP. De hecho, es muy fácil ampliar este concepto para escribir una utilidad de administración de memoria genérica (mediante el uso de la estructura sizeof () para saber exactamente cuántos bytes se administran) para administrar cualquier estructura definida por el usuario. Muchas de las bases de códigos de producción inteligentes escritas en C las usan mucho y, por lo general, nunca usan una matriz a menos que su alcance sea muy local.
De hecho, para una matriz incrustada en una estructura, puede hacer otras "cosas inteligentes", como la comprobación de límites en cualquier momento que desee acceder a esta matriz. Nuevamente, a menos que el alcance de la matriz sea muy limitado, es una mala idea usarlo y transmitir información a través de los programas. Tarde o temprano, te encontrarás con errores que te mantendrán despierto por las noches y arruinarán tus fines de semana.
struct
contenga solo una matriz.