Online C Compiler
Abrir en el compilador

Edición didáctica en español. El código y sus salidas conservan el original.

Punteros en C

Aprende a obtener direcciones, desreferenciar punteros y respetar los límites y la duración de los objetos.

Abrir en el compilador

Punteros en C
Aprende a obtener direcciones, desreferenciar punteros y respetar los límites y la duración de los objetos.

Un puntero almacena una dirección con un tipo asociado. El operador & obtiene la dirección de un objeto y * permite acceder al objeto apuntado. Antes de desreferenciar, asegúrate de que el puntero señala un objeto válido del tipo y duración adecuados.

La aritmética de punteros avanza en unidades del tipo apuntado. En un array puedes formar un puntero hasta una posición después del último elemento, pero no desreferenciar esa posición. La resta y las comparaciones de orden deben respetar las reglas para objetos de un mismo array.

Pasar un puntero copia su valor. Esa copia permite modificar el objeto original, pero cambiar la copia no modifica el puntero del llamador. Para actualizarlo, devuelve el nuevo puntero o recibe un puntero a puntero.

Inicializa los punteros, comprueba asignaciones y evita accesos después de free. Dibujar los objetos y las flechas entre ellos ayuda a entender listas, arrays de punteros y cambios de enlaces.

Código C

#include <stdio.h>
#include <stdlib.h>

void swap(int *a, int *b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int main(void) {
    int score = 95;
    int *ptr = &score;

    printf("Value via ptr : %d\n", *ptr);
    *ptr = 100;
    printf("Updated score : %d\n", score);

    int nums[4] = {10, 20, 30, 40};
    int *p = nums;
    for (int i = 0; i < 4; i++) {
        printf("*(p + %d) = %d\n", i, *(p + i));
    }
    printf("Bytes between p and p + 1: %zu\n",
           (size_t)((char *)(p + 1) - (char *)p));

    int x = 1, y = 2;
    swap(&x, &y);
    printf("After swap: x = %d, y = %d\n", x, y);

    int *heap = malloc(3 * sizeof(int));
    if (heap == NULL) {
        return 1;
    }
    for (int i = 0; i < 3; i++) {
        heap[i] = (i + 1) * 5;
    }
    printf("Heap values: %d %d %d\n", heap[0], heap[1], heap[2]);
    free(heap);
    heap = NULL;
    printf("heap is %s after free\n", heap == NULL ? "NULL" : "not NULL");
    return 0;
}
Abrir en el compilador

Salida esperada

Value via ptr : 95
Updated score : 100
*(p + 0) = 10
*(p + 1) = 20
*(p + 2) = 30
*(p + 3) = 40
Bytes between p and p + 1: 4
After swap: x = 2, y = 1
Heap values: 5 10 15
heap is NULL after free

Preguntas frecuentes

¿Por qué el código y la salida siguen en inglés?

Las palabras clave, los identificadores y los textos que verifican las pruebas se conservan para no cambiar el programa. Las explicaciones y los controles están traducidos.