Cómo hacer referencia a una estructura definida por typedef
Uso 1:
Defina un alias para un tipo, no solo un simple reemplazo de macro. Se puede utilizar para declarar varios objetos de tipo puntero al mismo tiempo. Por ejemplo:
char* pa, pb; // Esto probablemente no tenga el efecto esperado, solo declara un puntero a una variable de carácter,
// y una variable de carácter. ;
El siguiente método funcionará:
typedef char* PCHAR; // Generalmente usa letras mayúsculas
PCHAR pa, pb; // funcionará. pb; // funciona, declarando dos punteros a variables de caracteres al mismo tiempo
Mientras:
char *pa, *pb
también funciona, es no es tan intuitivo como usar typedef, que es menos engorroso, especialmente cuando se necesitan muchos punteros.
Uso dos:
Se usa en código C antiguo (específicamente, ¿cuántos años tiene? Verificar), útil para struct. En el código anterior, al declarar un nuevo objeto de estructura, debe tener la forma de estructura, es decir: nombre de la estructura de la estructura nombre del objeto, como por ejemplo:
struct tagPOINT1
{ pFun a[5];
2. Declaración original: void (*b[10]) (void (*)()); la parte entre paréntesis derechos y Use pFunParam como alias uno:
typedef void (*pFunParam)(
Luego reemplace la variable b a la izquierda y use pFunx como alias. dos:
typedef void (*pFunx)(pFunParam);
Versión minimizada de la declaración original:
pFunx b[10];
3. Declaración original: doube (*)() (*e)[9];
El nombre de la variable es e, reemplace la parte izquierda primero y use pFuny como uno de los alias:
typedef double(*pFuny) ();
Luego reemplaza la variable e a la derecha con pFunParamy como alias dos:
typedef pFuny (*pFunParamy) [9];
Declaración original La versión más simple de la declaración original:
pFunParamy e
Comprenda las "reglas de izquierda y derecha" de declaraciones complejas: primero mire el nombre de la variable, luego mire hacia la derecha, luego hacia la izquierda, cuando llegue al paréntesis, mire en la dirección opuesta después de analizar el paréntesis, salte fuera del paréntesis, mire hacia la derecha y luego hacia la; izquierda y repita hasta que se analice toda la declaración. Hasta que se analice todo el comunicado. Ejemplo:
int (*func)(int *p);
Primero busque la variable func. Hay un par de paréntesis con un signo * a la izquierda, lo que significa que func es un puntero; Luego salte de los corchetes, mire primero el lado derecho y luego encuentre los corchetes nuevamente, lo que significa que (* func) es una función, por lo que func es un puntero a dicha función, es decir, un puntero de función, una función, es decir, un puntero de función, que tiene parámetros formales de tipo int * y un valor de retorno de tipo int.
int (*func[5])(int *);
Hay un operador [] en el lado derecho de func, lo que significa que func es una matriz con 5 elementos. ; Hay un * en el lado izquierdo de func, lo que indica que los elementos en func son punteros (tenga en cuenta que el * aquí no modifica func, pero modifica func [5]. La razón es que el operador [] tiene un mayor prioridad que * y func First combinado con []). Salte de este corchete y mire hacia la derecha, y encontrará paréntesis nuevamente, lo que indica que los elementos de la matriz func son punteros a funciones de tipo func, y las funciones de tipo func apuntan a funciones con parámetros formales de tipo int* y tipo int. valores de retorno.
Hay otros 2 modos para recordar:
escribir (*)(....) puntero de función
escribir (*)[] puntero de matriz
------- ---------- ------
Trampa 1:
Por favor recuerde, a La definición de tipo es un nuevo alias para un tipo definido y, a diferencia de una macro, no es un simple reemplazo de cadena. Por ejemplo:
Primero defina:
typedef char* PSTR
Luego:
int mystrcmp(const PSTR, const PSTR) ;
¿Es const PSTR realmente equivalente a const char*? No, en realidad es equivalente a const char*.
La razón es que const le da a todo el puntero una constante, es decir, forma un puntero constante char* const.
En resumen, recuerde que cuando se combinan const y typedef, typedef se convierte en algo más que un simple reemplazo de cadena.
Trampa 2:
Typedef es sintácticamente una palabra clave de clase de almacenamiento (como auto, extern, mutable, static, Register, etc.), aunque realmente no afecta los atributos de almacenamiento del objeto, por ejemplo:
typedef static int INT2; // No factible
La compilación fallará y aparecerá "Más de una clase de almacenamiento especificada".