Online C Compiler
Openen in de compiler

Nederlandse leereditie

Pointers in C

Leer over adressen, derefereren, grenzen en de levensduur van objecten.

Openen in de compiler

Pointers in C
Leer over adressen, derefereren, grenzen en de levensduur van objecten.

Een pointer bevat een adres dat bij een type hoort. & geeft het adres van een object en * benadert het aangewezen object. Controleer vóór derefereren of het object bestaat en of type en levensduur kloppen.

Pointerrekenen gaat in eenheden van het aangewezen type. Je mag een pointer net voorbij het einde van een array vormen, maar niet derefereren. Aftrekken en volgordevergelijkingen moeten voldoen aan de regels voor elementen binnen hetzelfde array.

Een pointer doorgeven kopieert zijn waarde. Via die kopie kun je het object wijzigen, maar de kopie vervangen wijzigt niet de pointer van de aanroeper. Geef de nieuwe pointer terug of gebruik een pointer naar een pointer om die bij te werken.

Initialiseer pointers, controleer reserveringen en gebruik objecten niet na free. Een tekening met objecten en pijlen helpt bij lijsten en arrays van pointers.

Broncode

#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;
}
Openen in de compiler

Verwacht resultaat

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

Veelgestelde vragen

Waarom blijven code en sommige resultaten Engels?

C-sleutelwoorden, namen, programmacommentaar en verwachte uitvoer blijven gelijk aan het origineel om uitvoerbare code en consistente tests te behouden. Uitleg en instructies zijn vertaald.