Curso de programación con C
C es un lenguaje de programación rápido, portátil y eficiente, ideal para sistemas operativos, software embebido y aplicaciones de alto rendimiento.
El lenguaje C es uno de los lenguajes de programación más influyentes y ampliamente utilizados. Fue desarrollado a principios de la década de 1970 por Dennis Ritchie en los Laboratorios Bell, y ha servido como base para muchos otros lenguajes modernos (como C++, C#, Java y muchos más). A continuación, se presenta una explicación de los fundamentos de C y un recorrido por su sintaxis principal.
1. Características y fundamentos del lenguaje C
Lenguaje compilado:
El código fuente escrito en C se compila a código máquina específico para la arquitectura de la computadora, lo que permite programas eficientes y rápidos.Lenguaje estructurado:
Se basa en la descomposición del programa en funciones y módulos, facilitando el diseño, la lectura y el mantenimiento del código.Tipado estático y fuerte:
Cada variable en C debe declararse con un tipo específico (por ejemplo,int
,float
,char
), lo que ayuda a detectar errores durante la compilación.Acceso de bajo nivel:
Permite manipular directamente la memoria (por ejemplo, mediante punteros), lo que es fundamental en programación de sistemas y desarrollo de controladores, sistemas operativos y software embebido.Portabilidad:
Aunque el código debe compilarse para cada plataforma, C fue diseñado con portabilidad en mente, lo que significa que un programa en C puede ser adaptado a diferentes sistemas con pocos cambios.
2. Estructura básica de un programa en C
Todo programa en C tiene una estructura mínima que incluye la función main()
, que es el punto de entrada. Además, se utilizan directivas del preprocesador para incluir librerías o definir macros. Un ejemplo básico:
#include <stdio.h> // Inclusión de la librería estándar de entrada/salida
// Función principal: punto de entrada del programa
int main() {
// Instrucción que imprime un mensaje en la consola
printf("Hola, mundo!\n");
return 0; // Indica que el programa terminó correctamente
}
Elementos a notar:
#include <stdio.h>
: Directiva del preprocesador que incluye la librería estándar de entrada y salida.int main() { ... }
: Definición de la función principal.printf(...)
: Función para mostrar información en la consola.return 0;
: Devuelve un valor al sistema operativo indicando el estado de salida del programa.
3. Sintaxis principal del lenguaje C
Declaración de variables y tipos de datos
C tiene varios tipos de datos básicos:
- Enteros:
int
,short
,long
,unsigned int
, etc. - Punto flotante:
float
,double
. - Caracteres:
char
.
Ejemplo de declaración y asignación:
#include <stdio.h>
int main() {
int edad = 25; // Declaración de un entero
float altura = 1.75; // Declaración de un número de punto flotante
char inicial = 'J'; // Declaración de un carácter
printf("Edad: %d, Altura: %.2f, Inicial: %c\n", edad, altura, inicial);
return 0;
}
Formato de impresión:
%d
para enteros.%f
o%.2f
para números flotantes (con 2 decimales en este caso).%c
para caracteres.
Operadores
C cuenta con diversos operadores:
- Aritméticos:
+
,-
,*
,/
,%
(módulo) - Asignación:
=
,+=
,-=
, etc. - Comparación:
==
,!=
,<
,>
,<=
,>=
- Lógicos:
&&
(AND),||
(OR),!
(NOT) - Incremento/Decremento:
++
,--
Ejemplo:
#include <stdio.h>
int main() {
int a = 10, b = 3;
int suma = a + b;
int modulo = a % b;
printf("Suma: %d, Módulo: %d\n", suma, modulo);
return 0;
}
Estructuras de control
Sentencias condicionales
If-Else:
#include <stdio.h>
int main() {
int numero = 7;
if (numero % 2 == 0) {
printf("El número es par.\n");
} else {
printf("El número es impar.\n");
}
return 0;
}
Switch:
#include <stdio.h>
int main() {
int opcion = 2;
switch(opcion) {
case 1:
printf("Opción 1 seleccionada.\n");
break;
case 2:
printf("Opción 2 seleccionada.\n");
break;
default:
printf("Opción no reconocida.\n");
break;
}
return 0;
}
2. Bucles o iteraciones
While:
#include <stdio.h>
int main() {
int contador = 0;
while (contador < 5) {
printf("Contador: %d\n", contador);
contador++;
}
return 0;
}
Do-While:
#include <stdio.h>
int main() {
int contador = 0;
do {
printf("Contador: %d\n", contador);
contador++;
} while (contador < 5);
return 0;
}
For:
#include <stdio.h>
int main() {
int i;
for (i = 0; i < 5; i++) {
printf("Valor de i: %d\n", i);
}
return 0;
}
Funciones
Las funciones permiten modularizar el código. Se pueden declarar y definir funciones para realizar tareas específicas.
Ejemplo con una función que suma dos números:
#include <stdio.h>
// Declaración de la función (prototipo)
int sumar(int a, int b);
int main() {
int resultado = sumar(3, 4);
printf("La suma es: %d\n", resultado);
return 0;
}
// Definición de la función
int sumar(int a, int b) {
return a + b;
}
Aspectos a considerar:
- Los prototipos de función son útiles para indicar al compilador la existencia de funciones que se definirán posteriormente.
- Las funciones pueden retornar valores o ser del tipo
void
si no retornan nada.
Punteros
Los punteros son variables que almacenan direcciones de memoria. Permiten un control muy preciso sobre la memoria, lo que es crucial en aplicaciones de bajo nivel.
Ejemplo básico de punteros:
#include <stdio.h>
int main() {
int var = 20;
int *puntero = &var; // 'puntero' almacena la dirección de 'var'
printf("Valor de var: %d\n", var);
printf("Dirección de var: %p\n", (void*)&var);
printf("Valor almacenado en puntero: %p\n", (void*)puntero);
printf("Valor al que apunta puntero: %d\n", *puntero); // Desreferenciación
return 0;
}
Conceptos importantes:
&
: Operador de dirección.*
: Operador de desreferenciación, que accede al valor almacenado en la dirección indicada.
f) Arreglos y cadenas de caracteres
Un arreglo es una colección de elementos del mismo tipo. En C, las cadenas de caracteres se manejan como arreglos de char
terminados en un carácter nulo \0
.
Ejemplo de un arreglo y una cadena:
#include <stdio.h>
int main() {
int numeros[5] = {1, 2, 3, 4, 5}; // Arreglo de enteros
char saludo[] = "Hola"; // Arreglo de caracteres (cadena)
// Recorrido del arreglo de enteros
for (int i = 0; i < 5; i++) {
printf("numero[%d] = %d\n", i, numeros[i]);
}
// Imprimir la cadena
printf("Saludo: %s\n", saludo);
return 0;
}
Estructuras y uniones
Las estructuras permiten agrupar diferentes tipos de datos bajo un mismo nombre, facilitando la organización y manipulación de datos complejos.
Ejemplo de una estructura:
#include <stdio.h>
// Definición de una estructura para representar una persona
struct Persona {
char nombre[50];
int edad;
float altura;
};
int main() {
// Declaración e inicialización de una variable de tipo 'struct Persona'
struct Persona persona1 = {"Juan", 30, 1.80};
printf("Nombre: %s\n", persona1.nombre);
printf("Edad: %d\n", persona1.edad);
printf("Altura: %.2f\n", persona1.altura);
return 0;
}
Las uniones son similares a las estructuras, pero todos sus miembros comparten el mismo espacio de memoria, lo que permite ahorrar memoria cuando solo se usa uno de los miembros a la vez.
h) Manejo de memoria dinámica
La biblioteca <stdlib.h>
provee funciones para gestionar memoria dinámicamente, como malloc
, calloc
, realloc
y free
.
Ejemplo de asignación dinámica:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arreglo;
int n = 5;
// Asignar memoria para 5 enteros
arreglo = (int *)malloc(n * sizeof(int));
if (arreglo == NULL) {
printf("Error en la asignación de memoria.\n");
return 1;
}
// Inicializar y mostrar el arreglo
for (int i = 0; i < n; i++) {
arreglo[i] = i * 2;
printf("arreglo[%d] = %d\n", i, arreglo[i]);
}
// Liberar la memoria asignada
free(arreglo);
return 0;
}
Tutoriales de C
Aprende C con tutoriales de programación en C.
Tipo de tecnología
Lenguaje
Categoría laboral
Backend
Año de lanzamiento
1972
Developers
ISO/IEC JTC1/SC22/WG14
Todos los módulos del curso de C
Ver todos los módulos de COtras tecnologías
Rust
Rust
Backend
Lenguaje de programación de sistemas enfocado en seguridad, concurrencia y rendimiento.
R
R
Ciencia de Datos e IA
Lenguaje para análisis estadístico, manipulación de datos y visualización gráfica.
TypeScript
TypeScript
Full Stack
Superconjunto de JavaScript con tipado estático.
Go
Go
Backend
Lenguaje de programación eficiente y concurrente creado por Google.
Hibernate
Hibernate
Backend
ORM para Java, simplifica el acceso a bases de datos.
Django
Django
Backend
Framework web Python para desarrollo rápido y seguro.