Resumen de Fundamentos de Programación: Variables y Operadores
Fundamentos de Programación: Variables y Operadores Esenciales
Introducción
La programación en C es la base de muchos sistemas, compiladores y aplicaciones de bajo nivel. Este material ofrece una visión práctica y estructurada para estudiantes universitarios, centrándose en conceptos de diseño, estructura de programas, control de flujo, modularidad, manejo de memoria dinámica, depuración y buenas prácticas. No se tratan aquí Variables, Tipos de datos ni Operadores, ya que se cubren en otros módulos.
Definición: El lenguaje C es un lenguaje de programación de propósito general, de bajo nivel relativo, diseñado para permitir control preciso del hardware y eficiencia en la ejecución.
Estructura de un programa en C
Componentes principales
- Directivas de preprocesador:
#include,#definey macros. - Declaraciones de funciones y prototipos.
- Función
maincomo punto de entrada. - Bloques de código y sentencias de control.
Definición: Una directiva de preprocesador es una instrucción procesada antes de la compilación que modifica el texto fuente, típicamente para incluir cabeceras o definir macros.
Ejemplo básico de estructura
#include <stdio.h>
void saludar(void); // prototipo
int main(void) {
saludar();
return 0;
}
void saludar(void) {
printf("Hola, mundo\n");
}
Control de flujo y estructuras de decisión
Aunque no revisamos operadores específicos, es importante entender la lógica que gobierna el flujo: if, switch, for, while, do...while, y el uso de break y continue.
- Use
switchpara seleccionar entre múltiples casos discretos. - Prefiera bucles con condiciones claras para evitar bucles infinitos.
Definición: Un bucle es una estructura de control que repite un bloque de código mientras se cumpla una condición.
Ejemplo: menú con switch
#include <stdio.h>
int main(void) {
int opcion = 1; // ejemplo
switch (opcion) {
case 1:
printf("Seleccionó 1\n");
break;
case 2:
printf("Seleccionó 2\n");
break;
default:
printf("Opción inválida\n");
}
return 0;
}
Funciones y modularidad
- Diseñar funciones pequeñas y con una sola responsabilidad.
- Usar prototipos en cabeceras para separar interfaz e implementación.
- Pasaje por valor vs pasaje por referencia (punteros) para modificar datos desde la función.
Definición: Una interfaz en C típicamente se expresa mediante un archivo de cabecera
.hque contiene declaraciones de funciones, macros y tipos públicos.
Ejemplo: separación en archivos
- archivo
math_utils.hcon prototipos - archivo
math_utils.ccon implementaciones - archivo
main.cque incluyemath_utils.h
Punteros y manejo de memoria (dinámica)
malloc,calloc,reallocyfreeson funciones esenciales para la gestión dinámica.- Siempre verificar que
mallocno devuelvaNULLantes de usar la memoria. - Evitar fugas de memoria (memory leaks) liberando lo asignado.
Definición: Un puntero es una variable que almacena la dirección de memoria de otra variable o bloque de memoria.
Ejemplo: asignación dinámica simple
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *arr = malloc(10 * sizeof *arr);
if (arr == NULL) {
perror("malloc");
return 1;
}
// uso de arr
free(arr);
return 0;
}
Tabla comparativa: malloc vs calloc vs realloc
| Función | Inicialización | Uso típico | Comentario |
|---|---|---|---|
| malloc | No inicializa | Asignar $n$ bytes | Rápido, requiere inicializar si se necesita valor cero |
| calloc | Inicializa a cero | Asignar $n$ elementos de $m$ bytes | Útil para estructuras inicializadas a cero |
| realloc | Conserva/ajusta memoria | Cambiar tamaño de un bloque asignado | Puede mover el bloque; verificar puntero devuelto |
Seguridad y errores comunes
- Comprobar siempre límites al indexar arrays para evitar desbordamientos.
- Inicializar punteros antes de usarlos.
- Evitar uso de memoria l
¿Ya tienes cuenta? Iniciar sesión
Programación en C
Klíčové pojmy: Comprender la estructura básica de un programa en C, incluyendo preprocesador, prototipos y main, Separar interfaz e implementación mediante archivos .h y .c para mejorar modularidad, Diseñar funciones pequeñas con una sola responsabilidad, Usar punteros para pasar por referencia y modificar datos desde funciones, Gestionar memoria dinámica con malloc, calloc, realloc y free verificando retornos, Evitar desbordamientos de buffer validando límites al indexar arrays, Depurar con gdb, valgrind y sanitizers; reproducir fallos con casos mínimos, Seguir buenas prácticas de estilo: comentarios claros, nombres consistentes y funciones cortas, Verificar y manejar errores de asignación de memoria comprobando si punteros son NULL, Preferir pruebas unitarias y casos de prueba mínimos para detectar regresiones