Uso de typedef en lenguaje c
El lenguaje C permite dar un nuevo alias a un tipo de datos, como si se le diera un "apodo" a una persona.
El propósito de crear alias no es mejorar la eficiencia de ejecución del programa, sino facilitar la codificación. Por ejemplo, hay una estructura cuyo nombre es stu. Si quieres definir una variable de estructura, tienes que escribirla así: struct stu stu1;
struct parece redundante, pero si no lo haces. escríbelo, obtendrás un error. Si le da a struct stu un alias STU, será sencillo escribir: STU stu1;
Esta forma de escribir es más concisa y el significado es muy claro, ya sea en el archivo de encabezado estándar o en programación futura. práctica, utilizará este alias ampliamente.
Utilice la palabra clave ?typedef? para dar un nuevo alias a un tipo. El uso de typedef es generalmente: typedef ?oldName ?newName;
oldName es el nombre original del tipo y newName es el nuevo nombre del tipo. Por ejemplo: typedef int INTEGER;
INTEGER a, b;
a = 1;
b = 2;
INTEGER a , b; es equivalente a int a, b;.
Typedef también puede definir alias para matrices, punteros, estructuras y otros tipos. Veamos primero un ejemplo de definición de un alias para un tipo de matriz:
typedef char ARRAY20[20];
Indica que ARRAY20 es un alias de tipo char [20]. Es un tipo de matriz de longitud 20. Luego puedes usar ARRAY20 para definir el array: ARRAY20 a1, a2, s1, s2;
Es equivalente a: char a1[20], a2[20], s1[20], s2[20 ];
Tenga en cuenta que las matrices también tienen tipos. Por ejemplo, char a1[20]; define una matriz a1 y su tipo es char [20]. Esto se explicó en el tutorial VIP "Las matrices y los punteros no son equivalentes, las matrices son de otro tipo".
Otro ejemplo, define un alias para un tipo de estructura:
typedef struct stu{
char name[20];
int age ;
char sex;
} STU;
STU es un alias de struct stu. Puede utilizar STU para definir variables de estructura: STU cuerpo1, cuerpo2. ;
p>Es equivalente a: struct stu body1, body2;
Otro ejemplo, define un alias para el tipo de puntero: typedef?int (*PTR_TO_ARR)[4];
Indica que PTR_TO_ARR es un alias de tipo int * [4], que es un tipo de puntero de matriz bidimensional. Luego puede usar PTR_TO_ARR para definir un puntero de matriz bidimensional: PTR_TO_ARR p1, p2;
Siguiendo un método de escritura similar, también puede definir un alias para el tipo de puntero de función: typedef int (*PTR_TO_FUNC) (int, int);
p>
PTR_TO_FUNC pfunc;
El ejemplo define el alias para el puntero.
#include
typedef char (*PTR_TO_ARR)[30];
typedef int (*PTR_TO_FUNC)(int, int);
int max(int a, int b){
return a>b ? a : b;
}
char str[3][30 ] = {
"",
"Red china en lenguaje C",
"Lenguaje C"
}; p>
int main(){
PTR_TO_ARR parr = str;
PTR_TO_FUNC pfunc = max;
int i;
printf ("max: %d\n", (*pfunc)(10, 20));
for(i=0; i<3; i++){
printf( "cadena[%d]: %s\n", i, *(parr+i));
}
devuelve 0;
}
Resultado de la ejecución:
max: 20
str[0]:
str[1]: sitio web en idioma C chino
str[2]: lenguaje C
Debe enfatizarse que typedef le da un nuevo nombre a un tipo existente, en lugar de crear un nuevo tipo. Para "ver el nombre y comprender el significado", intente utilizar identificadores con significados claros y utilice letras mayúsculas tanto como sea posible. La diferencia entre typedef y #define
Typedef a veces se comporta como #define, pero existe una diferencia clave entre este y la sustitución de macros. La forma correcta de pensar en este problema es pensar en typedef como un tipo "encapsulado" completo y no se le pueden agregar otras cosas después de declararlo.
1) Los nombres de tipos de macros se pueden expandir usando otros especificadores de tipo, pero esto no se puede hacer para nombres de tipos definidos por typedef. Como se muestra a continuación: #define INTERGE int
unsigned INTERGE n ?//No hay problema
typedef int INTERGE;
unsigned INTERGE n ?//Error , no puede agregar unsigned delante de INTERGE
2) Al definir varias variables seguidas, typedef puede garantizar que todas las variables definidas sean del mismo tipo, mientras que #define