Descripción del curso C
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:
%dpara enteros.%fo%.2fpara números flotantes (con 2 decimales en este caso).%cpara 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
voidsi 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;
}
Lecciones y tutoriales de C
Ejercicios de programación de C
Módulos del curso
Explora todos los módulos disponibles en este curso de C
Explorar más tecnologías
Descubre más tecnologías de programación y desarrollo de software
Alan Sastre
Ingeniero de Software y formador, CEO en CertiDevs
Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, C es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.