Documentación de C
Referencia concisa y basada en ejemplos de C. Lee el concepto, mira el código y practícalo en un recorrido de Coddy.
Primeros pasos
- Qué es CC es un lenguaje compilado, pequeño y rápido de 1972 que todavía hace funcionar sistemas operativos, bases de datos y casi todos los dispositivos embebidos. Aquí está qué es, dónde se ejecuta y por qué vale la pena aprenderlo en 2026.
- Instalar C (GCC)Instala un compilador de C que funcione en cualquier sistema: MinGW-w64 en Windows, el clang de Apple en macOS y gcc en Linux, además de cómo comprobar que la instalación funcionó y compilar tu primer archivo.
- Compilar y ejecutarConvierte un archivo .c en un programa que se ejecuta: el comando gcc, qué hacen realmente el preprocesado, la compilación y el enlazado, las banderas que vale la pena usar desde el primer día, y cómo leer los errores cuando algo falla.
- Sintaxis de CTodo programa en C tiene el mismo esqueleto: includes, una función main, sentencias que terminan en punto y coma, y bloques entre llaves. Esto es lo que hace cada parte y las reglas que el compilador realmente impone.
- ComentariosC tiene dos estilos de comentario (de una línea con // y de varias líneas con /* */) con historias distintas y una trampa de anidamiento. Aquí verás cómo usar ambos, además de qué vale la pena comentar y qué no.
Variables y tipos
- VariablesCómo declarar una variable en C, la diferencia entre declaración e inicialización, las reglas de nombrado, declarar varias a la vez y por qué una variable sin inicializar es el error de principiante más común.
- Tipos de datosCada variable de C tiene un tipo que fija su tamaño y lo que puede guardar. Aquí están todos los tipos básicos, sus tamaños reales, con signo frente a sin signo, sizeof, limits.h y qué pasa en un desbordamiento.
- ConstantesTres formas de nombrar un valor que nunca cambia en C — la palabra clave const, las macros #define y las constantes de enum — qué es realmente cada una y cuál conviene usar en cada caso.
- OperadoresTodos los operadores de C que vale la pena conocer —aritméticos, de asignación, de comparación, lógicos y de incremento— más la trampa de la división entera, cómo se comporta el módulo con negativos y una tabla de precedencia en la que puedes confiar.
- BooleanosC no tuvo un tipo booleano hasta C99. Cero es falso, todo lo demás es verdadero, las comparaciones dan int - y stdbool.h te añade bool, true y false. Además, el error de = frente a == que este diseño habilita.
- Conversión de tiposC convierte entre tipos constantemente, a veces porque lo pediste con un cast y más a menudo por su cuenta. Aquí están las reglas de promoción, la sintaxis del cast explícito y las conversiones que pierden datos en silencio.
Flujo de control
- if y elseCómo decide C: la sentencia if, else, las cadenas else if, el anidamiento y el operador ternario, más la regla de la veracidad (0 es falso, todo lo demás es verdadero) y el error de `=` frente a `==` que rompe condiciones en silencio.
- switchCómo la sentencia switch de C elige una rama de una lista de constantes: etiquetas case, por qué importa el break, la caída en cascada deliberada y accidental, default, usar switch con chars y enums, y cuándo switch le gana a una cadena else-if.
- Bucle forCómo repetir código con el bucle for de C: el encabezado de tres partes, contar hacia arriba y hacia abajo, recorrer arrays con el truco de sizeof, bucles anidados, bucles infinitos y los errores de desplazamiento por uno y de tipos sin signo que atrapan a todos.
- Bucle whileCómo el bucle while de C repite hasta que una condición cambia: la regla de la condición primero, los bucles con centinela, leer entrada hasta EOF, while(1) y cómo convertir entre for y while.
- bucle do-whileEl bucle de C que ejecuta primero el cuerpo: cómo do-while garantiza una pasada antes de comprobar, por qué termina con punto y coma, los patrones de menú y reintento para los que fue hecho, y en qué se diferencia de un while normal.
- break y continuebreak abandona un bucle o un switch; continue salta a la siguiente pasada. Cómo se comporta cada uno en for, while y do-while, cómo escapar de bucles anidados con una bandera o goto, y los malos usos que vuelven ilegibles los bucles.
Funciones
- FuncionesCómo definir y llamar funciones en C: el tipo de retorno, los parámetros, los valores devueltos, las funciones void, por qué importa la descomposición y un ejemplo completo construido con piezas pequeñas y con nombre.
- Parámetros de funcionesC pasa todo por valor: las funciones reciben copias, nunca los originales. Qué significa eso en la práctica, cómo los punteros simulan el paso por referencia, por qué los arrays se comportan distinto y cómo devolver varios resultados.
- Prototipos de funcionesPor qué C necesita ver la forma de una función antes de que la llames: escribir prototipos, arreglar los errores de declaración implícita, poner prototipos en archivos de cabecera y la verdadera diferencia entre f(void) y f().
- RecursiónCómo una función de C se llama a sí misma: el caso base que la detiene, el factorial y Fibonacci resueltos paso a paso, por qué el Fibonacci ingenuo es catastróficamente lento, qué es realmente un desbordamiento de pila y cuándo un bucle es la mejor respuesta.
- ÁmbitoDónde es visible una variable de C y cuánto vive: ámbito de bloque, parámetros de funciones, globales de ámbito de archivo, variables locales static que sobreviven entre llamadas, funciones static, ocultamiento y por qué las globales dan problemas.
Punteros
- PunterosUn puntero es una variable que guarda una dirección de memoria. Esta página construye la idea desde cero: los operadores & y *, declarar y desreferenciar punteros, por qué importan los tipos de puntero y la función swap() que muestra por qué los punteros existen.
- Aritmética de punterosSumar 1 a un puntero no suma 1 byte: lo mueve al siguiente objeto de ese tipo. Esta página cubre ptr+1, el incremento y el decremento, la diferencia entre punteros, las comparaciones, recorrer un array con un puntero y la regla del uno más allá del final.
- Punteros y arraysEn C el nombre de un array se convierte en un puntero a su primer elemento casi en todos los lugares donde lo usas. Esta página explica ese decaimiento, por qué arr[i] es literalmente *(arr+i), por qué el tamaño del array debe viajar aparte hacia las funciones y en qué se diferencia un puntero a array de un array de punteros.
- Punteros a funcionesLas funciones también tienen dirección, y un puntero a función guarda una. Esta página descifra la sintaxis de la declaración, muestra cómo typedef la vuelve legible y llega hasta los callbacks, qsort con un comparador propio y las tablas de despacho.
- Punteros NULLNULL es la dirección que guarda un puntero cuando no apunta a nada. Esta página cubre qué es realmente NULL, por qué desreferenciarlo revienta, en qué se diferencia de 0 y de un puntero sin inicializar, y los patrones defensivos que mantienen los fallos por nulos fuera de tu código.
Arreglos y cadenas
- ArraysCómo declarar e inicializar arrays en C, indexarlos desde cero, calcular la longitud con sizeof, recorrer los elementos, y por qué leer más allá del final es comportamiento indefinido en lugar de un mensaje de error.
- Arrays multidimensionalesCómo declarar, inicializar y recorrer arrays 2D en C, qué significa realmente la disposición por filas en memoria, por qué pasar un array 2D a una función exige la cantidad de columnas y un ejemplo resuelto con matrices.
- CadenasC no tiene tipo cadena: una cadena es un array de char que termina en un byte '\0'. Esta página construye ese modelo mental y luego cubre los literales, la impresión, el recorrido y por qué no puedes copiar una cadena con =.
- Funciones de cadenasUn recorrido práctico por <string.h>: medir con strlen, copiar con strcpy y strncpy, unir con strcat, comparar con strcmp, buscar con strchr y strstr, y cómo dimensionar los búferes para que ninguna se desborde.
- Conversión de cadenasConvertir entre texto y números en C: por qué atoi no puede reportar un error, cómo usar strtol y strtod correctamente con endptr y errno, convertir números en cadenas con snprintf y los trucos de un solo dígito con '0'.
Memoria dinámica
- Memoria dinámicaPor qué existe el heap, cómo malloc te entrega memoria cuyo tamaño se decide en tiempo de ejecución, el modismo p = malloc(n * sizeof *p), comprobar NULL, liberar exactamente una vez, y un array dinámico resuelto de principio a fin.
- calloc y realloccalloc te da memoria puesta en cero y multiplica el tamaño de forma segura; realloc agranda un bloque que ya llenaste. Esta página cubre ambas, el modismo del puntero temporal que evita que un realloc fallido provoque una fuga, y cuándo calloc le gana a malloc más memset.
- Fugas de memoriaQué es realmente una fuga, las tres formas en que los programas de C las producen, la disciplina de propiedad que las previene y cómo encontrar las demás con valgrind y -fsanitize=address, terminando con un programa con fugas arreglado paso a paso.
- Pila y montónDónde vive realmente tu información: almacenamiento automático en la pila, almacenamiento dinámico en el montón y el almacenamiento estático como tercera región, con el clásico error del puntero colgante al devolver una local y una regla para elegir.
Structs, uniones y enums
- EstructurasCómo agrupar valores relacionados en un solo tipo con una struct de C: declararla, acceder a los miembros con el operador punto, inicializadores designados, arrays de estructuras, anidamiento y la regla de la copia al pasar que sorprende a todos.
- Estructuras y punterosCómo apuntar a una estructura en C: el operador flecha, por qué (*p).x necesita sus paréntesis, pasar estructuras por puntero para mutarlas o evitar copias, reservar una estructura con malloc y construir un nodo de lista enlazada.
- typedefCómo typedef le da un nombre nuevo a un tipo existente de C: el modismo typedef struct con y sin etiqueta, typedefs para punteros a funciones y arrays, y el único caso donde un typedef perjudica: esconder un puntero.
- UnionesCómo una union de C guarda varios tipos en los mismos bytes: por qué su tamaño es el del miembro más grande, por qué debes leer el miembro que escribiste por última vez y cómo una unión etiquetada (enum más union) la vuelve segura.
- enumsCómo definir un enum en C: numeración automática, valores explícitos, usar enums en un switch para que el compilador detecte casos faltantes, convertir un enum a cadena, y las convenciones de nombres que los mantienen legibles.
Entrada y salida
- printfCómo funciona realmente printf en C: el modelo de la cadena de formato, los especificadores que usas a diario, el ancho y la precisión para una salida alineada, imprimir decimales con sensatez, el valor de retorno y por qué printf(entrada_del_usuario) es un agujero de seguridad.
- scanfCómo leer entrada con scanf en C: por qué el & es obligatorio, cómo se manejan los espacios en blanco, el desbordamiento de búfer de %s y su arreglo con un ancho, comprobar el valor de retorno, el error del salto de línea sobrante y fgets como alternativa robusta.
- Especificadores de formatoTodos los especificadores de formato de C en un solo lugar: qué significan %d, %s, %c, %f, %p y el resto, los modificadores de longitud l, ll, h y z, ancho, precisión y banderas, y cuáles difieren entre printf y scanf.
- Manejo de archivosCómo leer y escribir archivos en C: la tabla de modos de fopen, comprobar NULL, escribir con fprintf y fputc, leer con fgets, fscanf y fgetc, el bucle canónico línea por línea, y cuándo usar el modo binario.
- Argumentos de línea de comandosCómo lee un programa en C su línea de comandos: la anatomía de argc y argv, recorrer los argumentos, qué contiene argv[0], convertir números con strtol en lugar de atoi, y una pequeña calculadora que junta todo.
El preprocesador
- PreprocesadorEl preprocesador edita el texto de tu código fuente antes de que el compilador lo vea: pega cabeceras, sustituye macros y activa o desactiva código. Aquí está toda la familia de directivas y cómo mirar su salida.
- MacrosMacros tipo objeto y tipo función con #define: por qué cada argumento y el cuerpo entero necesitan paréntesis, la trampa de la evaluación múltiple, las macros de varias líneas con do-while(0) y cuándo una función o un const son la mejor herramienta.
- Archivos de cabeceraCómo repartir un programa de C entre varios archivos: qué va en un .h, qué va en un .c, los guardianes de inclusión que evitan la doble inclusión, compilar varios archivos juntos y compartir variables globales con extern.
- Compilación condicionalCompila código distinto para builds distintos con #ifdef, #ifndef, #if, #elif y #else: interruptores de depuración, ramas por plataforma, definir macros desde la línea de comandos con -D, y usar #if 0 para desactivar código.
Biblioteca estándar
- Funciones matemáticasUn recorrido por math.h: sqrt, pow, fabs, floor y ceil, round, fmod, las familias trigonométrica y logarítmica, INFINITY y NAN, además de la bandera -lm del enlazador que provoca el clásico error de referencia indefinida.
- Números aleatoriosCómo generar números aleatorios en C con rand() y RAND_MAX, por qué se siembra con srand(time(NULL)) exactamente una vez, mapear a un rango con % y el pequeño sesgo que introduce, decimales aleatorios y secuencias reproducibles.
- Biblioteca estándarQué te da cada cabecera estándar —stdio.h, stdlib.h, string.h, math.h, time.h, ctype.h, limits.h, stdbool.h, stdint.h y assert.h— con un ejemplo corto y funcional de cada una.
Errores y depuración
- Fallo de segmentaciónUn segfault significa que tu programa tocó memoria que no le pertenece. Aquí están las cinco causas que explican casi todos, cada una con un ejemplo mínimo y su arreglo, además de cómo encontrar la línea exacta con gdb y AddressSanitizer.
- Errores comunesLos errores que todo programador de C comete al menos una vez: punto y coma olvidado, = en lugar de ==, declaraciones implícitas, scanf sin &, comparar cadenas con ==, división entera, variables sin inicializar y desplazamiento por uno, cada uno con su síntoma, su causa y su solución.
- Comportamiento indefinidoEl comportamiento indefinido es código sobre el que el estándar de C no impone ningún requisito, así que puede pasar cualquier cosa, incluido que el optimizador borre tus comprobaciones. Aquí está qué lo causa, por qué "funciona en mi máquina" no demuestra nada y las banderas que lo detectan.