sirven que punteros parametros para los funciones estructuras dobles declaracion como arreglos apuntadores c pointers structure dereference anonymous-struct

que - ¿Qué significa este puntero de definición de estructura de tipo(en C)?



punteros en c (4)

En el Capítulo 6 de K&R, una declaración se menciona a continuación:

struct{ int len; char *str; } *p;

No pude entender a qué estructura está apuntando este puntero p y si tal definición de puntero es válida incluso porque en todos los otros ejemplos dados en el libro y en los que he visto de otra manera, al definir un puntero a una estructura, el nombre de Es necesario mencionar la estructura, es decir, el tipo que se está definiendo. Por ejemplo,

struct example{ int a; ... }s1;

y entonces,

struct example *ptr = &s1;

así, se menciona que ptr está apuntando a un ejemplo de estructura de tipo y no solo a estructura.

También, de particular interés fue este:

* p-> str obtiene lo que apunta a str; * p-> str ++ incrementa str después de acceder a lo que apunta (como * s ++);

No pude seguir lo que p es en primer lugar, por lo tanto, no el incremento y la desreferencia también.

¿Que esta pasando aqui?

¡Gracias por adelantado!

PS Soy nuevo aquí, por lo que cualquier comentario sobre el formato de la pregunta también sería apreciado.


La palabra clave struct funciona como una versión extendida de typedef , excepto que creas un tipo personalizado complejo (llamado estructura) en lugar de crear un alias de un tipo existente. Si solo tiene una cosa que necesita usar el tipo declarado, no necesita proporcionar un nombre explícito para el tipo.

La primera declaración que está viendo declara una estructura con dos campos, pero no la nombra. Esto se llama una estructura anónima. La declaración, sin embargo, proporciona un puntero de ese tipo.

Un posible caso de uso para tal declaración es cuando crea un encabezado para una biblioteca externa, posiblemente uno que ni siquiera está escrito en C. En ese caso, el tipo de estructura puede ser opaco o incompleto, y solo necesita tener una referencia conveniente a algunas partes de ella. Hacer que la estructura sea anónima le impide poder asignarla fácilmente, pero le permite interactuar con ella a través del puntero.

Más comúnmente, verá esta notación usada junto con estructuras nombradas o al menos con alias. La segunda declaración podría ser reescrita como

struct example { ... } s1, *ptr;

En ese caso, el struct example *ptr = &s1; sería sólo ptr = &s1; .

Una ocurrencia aún más común es el uso de estructuras anónimas con typedef , crear nombres de tipos personalizados que no incluyen la palabra clave struct . Tu segundo ejemplo podría ser reescrito como

typedef struct { ... } example, *pexample; example s1; pexample ptr; // alternatively example *ptr; ptr = &s1;

Tenga en cuenta que el tipo de s1 es un example y no un struct example en este caso.


Para empezar considere el siguiente programa simple

#include <stdlib.h> #include <stdio.h> #include <string.h> int main(void) { struct { int len; char *str; } *p; p = malloc( sizeof( *p ) ); p->str = "Hello Nihal Jain"; p->len = strlen( p->str ); while ( *p->str ) putchar( *p->str++ ); putchar( ''/n'' ); free( p ); return 0; }

Su salida es

Hello Nihal Jain

Así que en esta declaración.

struct { int len; char *str; } *p;

Se declara un puntero del tipo de la estructura sin nombre. El puntero en sí no está inicializado. Podrías escribir por ejemplo

struct { int len; char *str; } *p = malloc( sizeof( *p ) );

Para este programa simple, no se requiere el nombre de la estructura porque ninguna declaración de un objeto del tipo de estructura está presente o es necesaria en el programa.

Por lo tanto, no puede declarar un objeto del tipo de estructura, pero no es obligatorio en este caso.

Según la norma C, la estructura o unión se declaran como

struct-or-union-specifier: struct-or-union identifieropt { struct-declaration-list } struct-or-union identifier

Se ve que el identificador es opcional si hay una lista de declaración de estructura. Por lo tanto, una estructura sin nombre se puede utilizar como un especificador de tipo.

Un ejemplo más con el uso de enumeraciones. Puede declarar enumeradores sin declarar el tipo de enumeración. Por ejemplo

enum { EXIT_SUCCESS = 0, EXIT_FAILURE = -1 };

Puede usar los enumeradores que tienen el tipo int sin declarar un objeto del tipo de enumeración si no hay tal requisito en el programa.


Si necesita una definición ad hoc, de uso único de una estructura (o unión) que no será útil fuera del alcance en el que se declaró, usaría lo que se denomina estructuras y uniones anónimas o sin nombre . Esto le evita tener que declarar la estructura antes de usarla y, en el caso de tipos complejos, declarar los tipos internos, como here .


También otro uso (de estructuras anónimas) sería usarlas dentro de uniones u otras estructuras que básicamente limitan el uso de esa estructura a esa unión o estructura de padres en particular, no es otra cosa, lo cual es bastante útil desde el punto de vista del programador porque mirar Código como este nos proporciona la información de que se usa localmente en el contexto de la estructura o unión dentro de él, nada más que eso. (También nos salva de nombrar).

Además, si utiliza esta estructura anónima, no podrá asignar una instancia de ella que no sea la que ya existe.

Ejemplo :-( comentario de stark: cómo usarlo?)

struct { int a; int b; } p; scanf("%d",&p.a);