Estructuras
Ciencias de la Computación III
Diego José Figueroa
¿Qué es un puntero?
¿Cómo se reserva espacio para un puntero?
¿Cómo se libera el espacio de un puntero?
Estructuras
- Colección de variables:
- Potencialmente de diferente tipo.
- Agrupado bajo un mismo nombre.
- Operando como una unidad.
- NO es un objeto.
- Facilitan el manejo de datos complejos.
- Es una definición de un tipo.
Estructuras
struct Point{
int x;
int y;
};
struct p = {0, 0};
printf("x: %d, y: %d", p.x, p.y);
Estructuras
struct Point{
int x;
int y;
} p = {0, 0};
printf("x: %d, y: %d", p.x, p.y);
Estructuras
struct Point newPoint(int x, int y){
struct Point p;
p.x = x;
p.y = y;
return p;
}
Estructuras
int pointCmp(struct Point a, struct Point b){
return a.x == b.x && a.y == a.y;
}
¿Comentarios?
Estructuras
int pointCmp(struct Point* a,struct Point* b){
return (*a).x == (*b).x && (*b).y == (*b).y;
}
¿Y ahora?
Estructuras
int pointCmp(struct Point* a,struct Point* b){
return a->x == b->x && a->y == b->y;
}
Estructuras
- Al pasar una estructura como argumento se crea una copia completa.
- Esto es ineficiente.
- Es mejor utilizar punteros.
Estructuras
struct Point{
int x;
int y;
};
struct Point p = {0, 0};
¿Cuánto espacio en memoria ocupa p?
Estructuras
struct Point{
char x;
int y;
};
struct Point p = {0, 0};
¿Cuánto espacio en memoria ocupa p?
Estructuras
- La memoria debe estar alineada
- En múltiplos de 4 bytes (word align)
- sizeof
- Obtiene el tamaño en bytes de un objeto
sizeof struct Point -> 8 bytes
Estructuras
struct Node{
int index;
struct Node next;
};
No soportado!
Estructuras
struct Node{
int index;
struct Node* next;
};
Esto sí es válido
Bit fields
- Para nosotros, llamados 'campos'.
- Permiten almacenar varios objetos en un solo word.
- Conjunto de bits adyacentes en un word.
- Muy útil para almacenar 'flags'.
unsigned int is_keyword : 1;
Bit fields
struct { unsigned int is_keyword : 1; unsigned int is_extern : 1; unsigned int is_static : 1;
}flags;
...
if(flags.is_static){
...
}
Union
- Parecido a una estructura.
- Pero sólo puede tomar el valor de uno de los objetos que lo componen
union tag{
int iVal;
float fVal;
double dVal;
} t;
t puede ser un int, un float o un double.
Typedef
- Permite darle crear nuevos nombres para tipos de datos.
typedef char* String;
String s = "doh!";
Typedef
- Múy útil en combinación con structs;
struct Node{
char* value;
struct Node* next;
}
Typedef
typedef char* String;
typedef struct Node* List;
struct Node{
String value; List next; };
03 - Structures
By Diego Figueroa
03 - Structures
- 831