Punteros
Un puntero es un valor que representa una dirección de memoria, similar a una ruta de acceso.
Operador *
El carácter * se utiliza para declarar punteros y acceder a sus valores.
Declaración de Punteros
int *ptr1, *ptr2;
Al declarar un puntero, se asigna aleatoriamente un espacio de memoria. Los datos apuntados son inicialmente aleatorios.
Inicialización de Punteros
int* ptr;
int valor;
ptr = &valor;
*ptr = 42;
Para punteros no inicializados, es recomendable: int* ptr = NULL;
Acceso a Valores
int numero = 10;
int* ptr_num = №
printf("Valor: %d", *ptr_num);
Nota: La dirección a la que apunta un nombre de array no puede modificarse.
Operador &
Obtiene la dirección de memoria de una variable.
int x = 8;
if (x == *(&x)) // Verdadero: obtiene dirección y luego valor
Operaciones con Punteros
- Suma/Resta con Enteros: Mueve el puntero.
- Suma entre Punteros: No permitida.
- Resta entre Punteros: Devuelve la distancia en unidades de datos. Tipo de retorno:
ptrdiff_t. - Comparación: Compara direcciones de memoria. Retorna 1 (true) o 0 (false).
Funciones
Estructura Básica
#include <stdio.h>
int calcular(int a);
int main(void) {
int resultado = calcular(5);
printf("Resultado: %d", resultado);
}
int calcular(int a) {
return a * 2;
}
Parámetros
Los parámetros se pasan por copia. Para modificar variables originales, usar punteros.
void intercambiar(int* x, int* y) {
int temporal = *x;
*x = *y;
*y = temporal;
}
int a = 1, b = 2;
intercambiar(&a, &b);
Arrays como Parámetros
int sumar_array(int arr[], int n) {
int suma = 0;
for (int i = 0; i < n; i++)
suma += arr[i];
return suma;
}
Parámetros Variables
#include <stdarg.h>
double promedio(int count, ...) {
double total = 0;
va_list args;
va_start(args, count);
for (int i = 0; i < count; i++)
total += va_arg(args, double);
va_end(args);
return total / count;
}
Funciones Recursivas
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
Función Principal
int main(void) {
printf("Programa ejecutado");
return 0;
}
Punteros a Funciones
int operar(int (*func)(int), int a, int b) {
return func(a) + func(b);
}
Gestión de Memoria
Puntero Void
Puntero de tipo indefinido que puede apuntar a cualquier tipo de dato.
Asignación de Memoria
int* arr = malloc(10 * sizeof(int));
int* arr_init = calloc(10, sizeof(int));
Liberación de Memoria
free(arr);
Modificación de Memoria
int* nuevo_arr = realloc(arr, 20 * sizeof(int));
Operaciones con Memoria
memcpy(dest, src, size);
memmove(dest, src, size);
memcmp(ptr1, ptr2, size);
Especificadores
extern: Declara funciones/variables definidas en otros archivos.static: Variables que mantienen su valor entre llamadas. Funciones de uso interno.const: Variables/parámetros inmodificables.restrict: Indica que un puntero es el único que accede a cierta memoria.