Manejo de Memoria y Funciones en C

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.

Etiquetas: punteros C gestión memoria funciones C alloc recursividad

Publicado el 9-9 18:28