El lenguaje de programación C, es uno de los lenguajes de programación más importantes hoy en día, a pesar de ser uno de los más veteranos.
¿Por qué es importante? Bueno, C es de amplio uso en sistemas operativos, compiladores, microcontroladores y dispositivos embebidos (probablemente tu nevera o vehículo tenga código escrito en C). Y no solo eso, C sentó las bases para el desarrollo de otros lenguajes de programación como Java, Objective-C, C# y C++, de ahí que la sintaxis de estos lenguajes sea parecida.
Y si, quizás no es un lenguaje de programación tan popular como Python o JavaScript, pero es un lenguaje de programación vital para el funcionamiento del mundo que tenemos hoy.
Además, al ser un lenguaje de programación de nivel intermedio (o bajo nivel, como otros dicen) permite entender a mayor profundidad cómo funciona la computadora, permitiéndonos controlar el hardware o la memoria
De ahí su importancia, y de ahí la creación de este curso. En 28 clases vas a conocer el lenguaje de programación C y vas a sentar unas bases sólidas para proyectos asociados a este lenguaje.
Iniciamos el curso de programación en C
¡Arrancamos el curso! Aquí aprenderás a programar desde 0, desde lo más básico.
Pero también es posible que ya tengas experiencia programando y solo te interese aprender sobre el lenguaje de programación de C.
En cualquiera de los dos casos, estoy seguro de que este curso podrá enseñarte mucho.
Historia, características y usos de C
Te cuento todo sobre el lenguaje de programación C: Quién lo creo, sus características, detalles y usos.
- Dennis Ritchie y Ken Thompson como creadores de C
- Características de C
- ¿Qué es un lenguaje de programación de alto nivel?
- ¿Qué es un lenguaje de programación de bajo nivel?
- Ventajas de C como lenguaje de programación
- Qué es programación estructurada
- Qué es un lenguaje tipado
- Dónde se usa C
- Qué es un lenguaje de programación compilado
- Qué es un lenguaje de programación interpretado
- Importancia de C como lenguaje de programación
Instalación de C en Windows
Te explico cómo instalar C en Windows paso a paso, y de paso hacemos algunas definiciones.
- Descarga de DevC++
- Descarga de MinGW
- Qué es GCC
- Modificación de variables de entorno en Windows
- Descarga de VS Code e instalación de extensiones
- Cómo compilar un programa de C en Windows
Instalación de C en Linux
Te explico cómo instalar C en Linux, empezando por la instalación de GCC.
- Instalación de GCC
- Prueba de instalación
- Instalación de extensiones en VS Code
- Cómo compilar un archivo en C desde la terminal de comandos
Ventajas y desventajas de aprender a programar en C
Estructura de un programa en C
La estructura de un programa en C comprende varias partes: directivas, función main, la parte del código y el tipo de retorno.
Esto es lo que veremos:
- Análisis de la estructura de un programa en C
- Directivas del preprocesador
- Función main
- La instrucción return
- ¿Por qué devolvemos 0 en la función main?
Qué es una variable en programación
Una variable en programación es un espacio en memoria, al que le damos un nombre simbólico y le asignamos un valor.
En esta clase te explico qué es una variable, cómo se declara e inicializa, su ámbito de aplicación o scope, variables constantes con const y con macro, palabras protegidas, tipos de variables y especificadores de formato.
- ¿Qué es una variable en programación?
- Cómo declarar una variable
- Cómo inicializar una variable
- Declaración e inicialización de una variable en una sola línea
- Variables locales en C (scope de una variable)
- Variables globales en C (scope de una variable)
- Variables constantes en C
- Variables constantes declaradas como macro en C
- Palabras protegidas en C
- Tipos de variables en C (int, char, short, unsigned, long)
Qué es una función en programación
Una función en programación en un bloque de código que tiene un propósito definido.
En esta clase te explico qué son las funciones, para qué sirven, los prototipos y cómo se declaran las funciones en el lenguaje de programación C.
Adicional te cuento sobre unas cuantas flags que considero muy útiles al compilar en GCC.
- ¿Qué es una función en programación?
- Sintaxis de una función en C
- Ejemplo de una función en C
- Prototipos de función en C
- Configuración de la extensión para compilar en VS Code
- Flags de compilación en GCC: Wall, Pedantic, Werror y Wextra
- Paso por parámetros en funciones de C
- Qué es desbordamiento de entero (Integer overflow)
Proceso de compilación en C
Te explico cada una de las etapas del proceso de compilación en C: Preprocesamiento, compilado, ensamblado y enlazado y las abordamos con un ejemplo práctico.
- El proceso de compilación en C
- ¿Qué es compilación?
- Ejemplo de compilación que abordaremos
- Etapa de preprocesamiento
- Etapa de compilada
- Etapa de ensamblado y generación de código objeto
- Etapa de enlazado
- Introducción a make files
Condicionales en programación
Los condicionales en programación nos permiten controlar el flujo de un programa, es decir, qué porciones de código deberían ejecutarse y qué porciones no, basado en el cumplimiento de una condición.
En C se evalúan los condicionales teniendo en cuenta que cuando una condición es falsa, esta devuelve 0.
En este vídeo aprenderás sobre la sintaxis de un condicional en programación, los operadores relacionales y booleanos.
- Qué son los condicionales (if) en programación
- Qué es falso y verdadero en programación
- Cómo maneja C los condicionales
- Qué son los operadores relacionales
- Qué son los operadores booleanos
- Tablas de verdad
- Sintaxis de condicionales en C (IF – ELSE)
Bucles (loops) en programación
Los bucles te permiten ejecutar un código por una serie de veces hasta que una condición se evalúe como falsa. Un bucle está compuesto por una declaración de control (la condición) y el cuerpo del bucle, que es el código que se ejecuta hasta que la condición se mantenga verdadera.
En esta clase aprenderás los diferentes tipos de bucle y otros temas como la tabla ASCII.
- Qué es un bucle o loop en programación
- Estructura de un bucle
- Ejemplos de loops
- Ejemplo del bucle While
- Ejemplo del bucle Do-While
- Ejemplo del bucle for
- Qué es la tabla ASCII y para qué se utiliza
- La instrucción continue en un bucle
Qué es un array (arreglos) y para qué se utiliza
También conocido como arreglo, vector o matriz, los arreglos en programación son un tipo de estructuras de datos que contienen elementos del mismo tipo.
Hoy te contaré qué es un array, cómo se declara, cómo luce en la memoria, como se acceden elementos al interior del array, arrays multidimensionales y mucho más.
- Qué es un array en programación
- Cómo declarar e inicializar un array en C
- Cómo acceder a un elemento del array
- Cómo acceder a un elemento del array
- Qué sucede en la memoria con los arrays
- Cómo obtener la dirección de memoria de una variable
- El sistema hexadecimal y las direcciones de memoria
- Paso por valor y paso por parámetros en una función de C
- Arrays multidimensionales en C
Punteros en programación
Un puntero en el lenguaje de programación C es una variable cuyo valor es la dirección de memoria de otra variable. Profundizaremos sobre qué es un puntero, cómo se declara e inicializa, qué es el desreferenciamiento y cómo luce un puntero en la memoria.
- Qué es un puntero
- Qué es un puntero
- Cómo declarar e inicializar un puntero en C
- Desreferenciamiento a través de punteros
- Cómo acceder al valor de la variable a la cual apunta el puntero
- Puntero en la memoria
Aritmética de punteros
Un puntero es una variable cuyo valor es la dirección de memoria de otra variable. Dado que este es un valor numérico, podemos realizar operaciones aritméticas (suma y resta) sobre este. A estas operaciones se les denomina aritmética de punteros. Hoy veremos para qué sirve la aritmética de punteros en el lenguaje de programación C, qué es el operador de desreferenciamiento, aritmética sobre arrays y más.
- Qué es aritmética de punteros en C
- Puntero declarado en la memoria
- Cambio de la dirección de memoria por incremento
- Qué es un valor basura o garbage value
- Aritmética de punteros sobre un array de chars
Strings o cadenas de caracteres
En programación, un string es una cadena de caracteres. En otras palabras, es una secuencia ordenada de caracteres (letras, números o símbolos). Te explico cómo se declaran, acceden y manipulan en el lenguaje de programación C, y abordamos además otros temas como las secuencias de escape y el NULL
carácter.
- Qué es un string o cadena de caracteres en programación
- Cómo se declara un string en el lenguaje de programación C
- El NULL carácter en C
- Qué es una secuenca de escape en C
- Strings en la memoria
- String.h como librería para trabajar con Strings
- Uso del operador de desreferencia para manipular posiciones del string
- Uso del operador de desreferencia para manipular posiciones del string
- La mejor forma para declarar un string
- Modificación de un string desde una función (paso por referencia)
Deterioro del array y puntero a array
La decaída o deterioro del Array en C consiste en la pérdida de su tipo y dimensiones. En Inglés, este concepto es ampliamente conocido como Array Decay. Hoy detallamos cómo se genera el array decay
en el lenguaje de programación C, pero también hablamos de los punteros a array y de la diferencia entre puntero al primer elemento del array type (*) y puntero al array completo type (*)[n], lo que nos lleva a hablar superficialmente de punteros a punteros.
- Qué es array decay en el lenguaje de programación C
- Ejemplo de array decay
- Diferencia entre puntero a array y puntero al primer elemento del array
- Puntero a array completo en la memoria
- Incremento en un puntero a array
- Acceso al array en sí desde el puntero al array
- Obtención del tamaño del array desde otra función
Puntero a puntero en C
Un puntero es una variable que tiene la dirección de memoria de otra variable. ¿Qué pasa si declaramos un puntero cuyo valor es la dirección de memoria de otro puntero?
Es lo que descubrimos hoy, porque hablamos de punteros a punteros en el lenguaje de programación C.
Argumentos de línea de comandos
Desde la línea de comandos puedes enviar argumentos a tu programa en C. Y lo puedes hacer a través de argc
y argv
, siendo el primero un entero que tiene el número de argumentos que pasamos y argv un puntero a un array de strings, que contiene los argumentos que estamos pasando.
Hoy te cuento como se trabaja con argc y argv, y por supuesto experimentamos con la memoria y seguimos fortaleciendo nuestro conocimiento de arrays, strings y punteros.
- Qué son los argumentos de línea de comandos (argc, argv)
- Qué es argc – argument counter
- Qué es argv – argument vector
- Qué es argv – argument vector
- Ejemplo de argc
- Qué son las directivas attribute en el lenguaje de programación C
- Ejemplo de argv
- Diferencia de char *argv[] y char **argv
- Ejemplo de argc y argv con direcciones de memoria
Qué es recursión y cuándo se usa
Hoy hablamos sobre recursión. Podrás entender recursión en el lenguaje de programación C (y en realidad para cualquier lenguaje) a través de múltiples ejemplos. Vamos a profundizar sobre conceptos como stack y segmentation fault, la diferencia entre recursión e iteración y cuándo usar una u otra, realizaremos además un pequeño benchmark para ver qué opción es más rápida y conocerás tips para elegir una u otra opción.
- Qué es recursión
- Ejemplo básico de recursión
- Qué es segmentation fault
- La recursión en la memoria
- Qué es stack en C
- Ejemplo de recursión en C con Factorial
- Recursión VS Iteración
- Benchmark recursión e iteración con factorial en C
- Fibonacci como recursión y su impacto en el tiempo
- Cuándo usar la recursión
El preprocesador en C y cómo usarlo
Si bien ya hablamos del preprocesamiento como etapa de compilación, existen algunas cosas interesantes que podemos hacer con el preprocesador a nivel de código.
Hoy hablamos de macros predefinidas, operadores de preprocesamiento y macros parametrizadas.
- Qué son las directivas del preprocesador
- Qué son las macros predefinidas
- Cómo crear una macro parametrizada para logging
Qué es memoria dinámica y cuáles son los segmentos de memoria
El layout o disposición de la memoria en el lenguaje de programación C se puede dividir principalmente en 4 zonas o segmentos.
El primero es el segmento .text o texto, que contiene las instrucciones del programa. Luego tenemos el segmento que contiene las variables globales y estáticas, que a su vez se divide en bss y ds register. El siguiente segmento es el stack del que ya hemos hablado en otras clases de este curso de C y por último tenemos el segmento heap que se gestiona a través de malloc (memory allocation) y free, ambos destinados a la memoria dinámica.
Este último es el que entenderemos con mayor detalle dada la importancia de la memoria dinámica en el lenguaje de programación C.
- Cómo se divide la memoria en el lenguaje C
- Segmento text en la memoria
- Segmento static / global en el layout de la memoria
- Qué es el stack en la memoria y los stack frames
- Qué es block starting symbol
- Qué es data segment register
- Tipos de memoria en C
- Memoria automática
- Memoria estática
- Memoria dinámica
- Ventajas y desventajas de cada segmento de memoria
- Ejecución de código por región de memoria
- Limitantes del stack en la memoria
- Qué es un VLA o variable length array
- Qué es heap en el layout de la memoria
- Qué es malloc y free para la memoria dinámica
Cómo manipular la memoria en C con malloc y free
Hoy sabrás cómo utilizar malloc y free para asignar memoria dinámica. Vamos a detallar todos los casos de uso de malloc: 1) cuando no hay espacio suficiente para reservar, 2) bloques contiguos de memoria 3) cómo liberar la memoria asignada y muchos más.
- Por qué es necesaria la memoria dinámica
- Una variable local no se puede acceder por fuera de su alcance
- Malloc para asignar memoria dinámica
- Funcion sizeof como parámetro de malloc
- Operador de desreferencia como parámetro de malloc
- Se debería castear o no el resultado de malloc
- Espacio insuficiente para asignar memoria con malloc
- Free para liberar memoria
- Asignación de bloques contiguos de memoria
- Como detectar los memory leaks
Cómo detectar fugas de memoria (memory leaks)
Valgrind es una herramienta que se ejecuta en entornos Linux y que nos permitirá analizar las fugas de memoria de nuestro programa en C. Hoy te cuento cómo se usa, cómo se analizan los informes y mucho más.
- Instalación de Valgrind en Linux
- Cómo analizar memory leaks con Valgrind
- Obtener línea exacta de fuga de memoria
- Otras funcionalidades de Valgrind
Cómo utilizar calloc y realloc para manipular la memoria dinámica
Calloc y realloc son las funciones del lenguaje de programación C que complementan la gestión de la memoría dinámica. Calloc es muy similar a Malloc en su sintaxis y forma de uso, la gran diferencia es que además de reservar memoria dinámica, asigna cero a todos los valores reservados.
Por otra parte, realloc o reallocation memory, permite cambiar el tamaño de la memoria dinámica asignada previamente.
Hoy hablamos de qué son las funciones calloc y realloc y cómo se usan en C.
- Qué es calloc y cómo se usa
- Qué es realloc y cómo se usa
- Ejemplo de calloc en lenguaje de programación C
- Ejemplo de realloc en C
Manipulación de archivos en C (File IO): Abrir, leer, modificar
Detallamos como abrir, leer, modificar y cerrar archivos en C a través de funciones como fopen, fputs, fputc, fwrite y fclose.
Esto nos lleva a detallar conceptos como end of line (EOF) y a profundizar en funciones de C como exit y fprintf.
También hablaremos de los standard streams o flujos de entrada y salida, explicando qué significa standard input, standart output y standard error y para qué son útiles.
Detallamos muchos temas:
- Puntero a file
- Abrir un archivo en C: fopen
- Qué son los standard streams: stdin, stdout y stderr
- Funcion exit en C
- Funciones fgetc y fgets
- Cómo cerrar un archivo en C: fclose
- Cómo utilizar standard error o stderr
- Cómo modificar un archivo en C
- Funciones fputc y fputs
- Función fprintf y su diferencia con fputs
- Función fwrite
- Dierencia entre fopen y open (system call functions)
Structs o estructuras y typedef en C
Structs o estructuras en C son variables relacionadas bajo un mismo nombre. Estas variables pueden ser de diferentes tipos, a diferencia de los arrays en las que sus elementos deben ser del mismo tipo.
De esta manera, a través de los structs o estructuras en C, podemos representar un registro.
Hoy te cuento qué son, cómo se implementan las estructuras en el lenguaje de programación C, ademá de su relación con typedef y la utilidad de los punteros a estructuras.
- Qué es struct en C
- Sintaxis de struct en C
- Cómo declarar e inicializar una estructura
- Diferencia entre array de tipo char y puntero a char
- Qué es un inicializador designado en C
- Estructura dentro de otra estructura
- Pointer to struct o cómo trabajar punteros a estructuras
- Typedef para las structs
Funciones variadicas en C
Las funciones variadicas o variadic functions son aquellas que pueden recibir un número variable de argumentos. Sintaxis, cómo se implementan y ejemplos prácticos de funciones variadicas es lo que veremos en el lenguaje de programación C.
- Qué es una variadic function en C
- Sintaxis de una función variadica
- Ejemplo de función variadica
Conclusiones del curso de programación en C
Terminamos el curso para aprender a programar en C. Hemos aprendido desde los conceptos más básicos de programación como variables, funciones, condicionales, bucles y proceso de compilación, hasta temas más avanzados como punteros, manipulación de memoria, funciones variadicas y gestión de archivos.
Pero, aún queda mucho por aprender en C. Hoy te quiero contar qué sigue después de este curso.
Me gustaría que realizaras un curso de C para Psoc 5LP y Pesoc 6.