97 lines
3.5 KiB
Markdown
97 lines
3.5 KiB
Markdown
# PEC 2
|
|
|
|
**Índice**
|
|
- [PEC 2](#pec-2)
|
|
- [4. Estructura de memoria](#4-estructura-de-memoria)
|
|
- [4.1. Memoria](#41-memoria)
|
|
- [4.1.1. Información y espacio](#411-información-y-espacio)
|
|
- [4.2. Memoria estática](#42-memoria-estática)
|
|
- [4.3 Relación entre objetos y memoria](#43-relación-entre-objetos-y-memoria)
|
|
- [4.4. El tipo puntero en C](#44-el-tipo-puntero-en-c)
|
|
- [4.4.1. Declaración](#441-declaración)
|
|
- [4.4.2. Operaciones](#442-operaciones)
|
|
- [4.4.2.1. Asignación](#4421-asignación)
|
|
- [4.4.2.2. Contenido](#4422-contenido)
|
|
|
|
|
|
## 4. Estructura de memoria
|
|
|
|
Conceptos básicos de los efectos que produce un programa en la memoria.
|
|
|
|
### 4.1. Memoria
|
|
|
|
Un programa no se ejecuta desde el disco, sino que se carga en la memoria RAM (Random Access Memory). La memoria es un recurso finito y limitado, por lo que es importante gestionarla de forma eficiente. Por este motivo, el SO se encarga de ir moviendo los programas entre la memoria y el disco, pero desde la vista del programador debemos entender que el programa siempre está cargado en memoria.
|
|
|
|
Cada posición está identificada unívocamente con un valor numérico (su dirección) y tiene capacidad de 8 bytes.
|
|
|
|
Cuando asignamos un valor (constante o variable) se asigna un rango de direcciones donde pondrá su valor.
|
|
|
|
|
|
#### 4.1.1. Información y espacio
|
|
|
|
| Tipo | Tipo C | Tamaño en bytes | Rango de valores |
|
|
| ------ | -------------- | --------------- | ------------------------------------------------- |
|
|
| Entero | char | 1 | -128 to 127 o 0 to 255 |
|
|
| Entero | unsigned char | 1 | 0 a 255 |
|
|
| Entero | signed char | 1 | -128 a 127 |
|
|
| Entero | int | 2 o 4 | -32,768 a 32,767 o -2,147,483,648 a 2,147,483,647 |
|
|
| Entero | unsigned int | 2 o 4 | 0 a 65,535 o 0 a 4,294,967,295 |
|
|
| Entero | short | 2 | -32,768 a 32,767 |
|
|
| Entero | unsigned short | 2 | 0 a 65,535 |
|
|
| Entero | long | 4 | -2,147,483,648 a 2,147,483,647 |
|
|
| Entero | unsigned long | 4 | 0 a 4,294,967,295 |
|
|
| Real | float | 4 | 1.2E-38 a 3.4E+38 -> 6 decimales |
|
|
| Real | double | 8 | 2.3E-308 a 1.7E+308 -> 15 decimales |
|
|
| Real | long double | 10 | 3.4E-4932 a 1.1E+4932 -> 19 decimales |
|
|
|
|
En los casos con dos opciones de tamaño es porque depende del sistema operativo y del compilador. En general, en sistemas de 32 bits, `int` y `long` son de 4 bytes, mientras que en sistemas de 64 bits, `int` es de 4 bytes y `long` es de 8 bytes.
|
|
|
|
Con la instrucción `sizeof` se puede obtener el tamaño en bytes de un tipo de dato.
|
|
|
|
```c
|
|
#include <stdio.h>
|
|
#include <float.h>
|
|
int main() {
|
|
printf("Storage size for float : %d \n", sizeof(float));
|
|
printf("Minimum float positive value: %E\n", FLT_MIN );
|
|
printf("Maximum float positive value: %E\n", FLT_MAX );
|
|
printf("Precision value: %d\n", FLT_DIG );
|
|
|
|
return 0;
|
|
}
|
|
```
|
|
|
|
|
|
### 4.2. Memoria estática
|
|
|
|
|
|
|
|
|
|
### 4.3 Relación entre objetos y memoria
|
|
|
|
|
|
|
|
|
|
### 4.4. El tipo puntero en C
|
|
|
|
|
|
#### 4.4.1. Declaración
|
|
|
|
|
|
|
|
#### 4.4.2. Operaciones
|
|
|
|
|
|
|
|
|
|
##### 4.4.2.1. Asignación
|
|
|
|
|
|
|
|
|
|
##### 4.4.2.2. Contenido
|
|
|
|
|
|
|
|
|