stringtranslate.com

estructura (lenguaje de programación C)

En el lenguaje de programación C , struct es la palabra clave que se utiliza para definir un tipo de datos compuesto , también conocido como registro , es decir, un conjunto de valores con nombre que ocupan un bloque de memoria. Permite acceder a los diferentes valores a través de un único identificador , a menudo un puntero . Una estructura puede contener otros tipos de datos, por lo que se utiliza para registros de tipos de datos mixtos. Por ejemplo, una estructura de cliente de un banco puede contener los campos: nombre, dirección, teléfono, saldo.

Una estructura ocupa un bloque contiguo de memoria, normalmente delimitado (dimensionado) por límites de longitud de palabra. Corresponde a la función de nombre similar disponible en algunos ensambladores para procesadores Intel. Al ser un bloque de memoria contiguo, cada campo dentro de una estructura se ubica en un cierto desplazamiento fijo desde el inicio.

El operador sizeof da como resultado la cantidad de bytes necesarios para almacenar una estructura en particular, tal como ocurre con un tipo de datos primitivo . La alineación de campos particulares en la estructura (con respecto a los límites de palabras ) es específica de la implementación y puede incluir relleno. Los compiladores modernos suelen admitir la #pragma packdirectiva, que establece el tamaño en bytes para la alineación. [1]

La característica de estructura C se derivó del concepto del mismo nombre en ALGOL 68. [ 2]

Declaración

La sintaxis para una declaración de estructura se muestra en este sencillo ejemplo:

struct tag_name { tipo miembro1 ; tipo miembro2 ; };      

El tag_namees opcional en algunos contextos.

Definición de tipo

A través de la palabra clave typedef, se puede hacer referencia a un tipo de estructura sin utilizar la structpalabra clave. Sin embargo, algunas guías de estilo de programación [¿ quién? ] desaconsejan esta práctica, ya que afirman que puede ofuscar el tipo.

Por ejemplo:

typedef struct nombre_etiqueta { tipo miembro1 ; tipo miembro2 ; } cosa_t ; cosa_t cosa ;         

En el código C++, no se necesita typedef porque los tipos definidos a través de structson parte del espacio de nombres regular, por lo que se puede hacer referencia al tipo como struct thing_to thing_t.

Inicialización

Hay tres formas de inicializar una estructura.

Para el tipo:

estructura punto_t { int x ; int y ; };      

Los inicializadores de estilo C89 se utilizan cuando se pueden proporcionar miembros contiguos. [3] Por ejemplo:

estructura punto_t a = { 1 , 2 };       

Para listas de miembros no contiguos o fuera de orden, se puede utilizar el estilo de inicializador designado . [4] Por ejemplo:

estructura punto_t a = { . y = 2 , . x = 1 };           

Si se proporciona un inicializador o si el objeto se asigna estáticamente , los elementos omitidos se inicializan a 0.

Una tercera forma de inicializar una estructura es copiar el valor de un objeto existente del mismo tipo. Por ejemplo:

estructura punto_t b = a ;    

Copiar

El estado de una estructura se puede copiar a otra instancia. Un compilador podría utilizar memcpy()para copiar los bytes del bloque de memoria.

estructura punto_t a = { 1 , 3 }; estructura punto_t b ; b = a ;           

Punteros

Los punteros se pueden utilizar para hacer referencia a una estructura structpor su dirección. Esto resulta útil para pasar una estructura a una función y evitar la sobrecarga que supone copiar la estructura. El ->operador desreferencia el puntero (operando izquierdo) y accede al valor de un miembro de la estructura (operando derecho).

struct punto_t punto = { 3 , 7 }; int x = punto . x ; punto . x = 10 ; struct punto_t * pp = & punto ; x = pp -> x ; pp -> x = 8 ;                    

En otros idiomas

C++

En C++ , una estructura es esencialmente lo mismo que en C. Además, una clase es lo mismo que una estructura pero con una visibilidad predeterminada diferente : los miembros de la clase son privados de manera predeterminada, mientras que los miembros de la estructura son públicos de manera predeterminada.

.NETO

Los lenguajes .NET tienen una característica similar a la estructura de C ( structen C# y Structureen Visual Basic .NET se la denomina estructura ). Esta construcción proporciona muchas características de una clase, pero actúa como un tipo de valor en lugar de un tipo de referencia . Por ejemplo, al pasar una estructura de .NET a una función, el valor se copia de modo que los cambios en el parámetro de entrada no afecten al valor pasado. [5]

Véase también

Referencias

  1. ^ "Disposición de la memoria estructural en C". Desbordamiento de pila .
  2. ^ Ritchie, Dennis M. (marzo de 1993). "El desarrollo del lenguaje C". ACM SIGPLAN Notices . 28 (3): 201–208. doi : 10.1145/155360.155580 . El esquema de composición de tipos adoptado por C debe una deuda considerable a Algol 68, aunque tal vez no surgió en una forma que los partidarios de Algol aprobarían. La noción central que capté de Algol fue una estructura de tipos basada en tipos atómicos (incluidas las estructuras), compuestas en matrices, punteros (referencias) y funciones (procedimientos). El concepto de uniones y conversiones de Algol 68 también tuvo una influencia que apareció más tarde.
  3. ^ Kelley, Al; Pohl, Ira (2004). Un libro sobre C: Programación en C (cuarta edición). pp. 418. ISBN 0-201-18399-4.
  4. ^ "Compiladores de IBM Linux. Inicialización de estructuras y uniones".
  5. ^ "Paso de parámetros en C#".