Pointer arithmetic moves by element positions, not raw byte counts.

element step `ptr + offset` advances by `offset` elements of the pointed-to type.
array base An array name can provide a pointer to its first element.

Pointer Arithmetic

offset
pointer_arithmetic.c
Replay: real traced execution (multi-file project)
#include <stdio.h>

int main(void) {
    int values[4] = {2, 4, 6, 8};
    int offset = 2;
    int *base = values;
    int item = *(base + offset);

    printf("item=%d\n", item);
    return 0;
}
#include <stdio.h>

int main(void) {
    int values[4] = {2, 4, 6, 8};
    int offset = 1;
    int *base = values;
    int item = *(base + offset);

    printf("item=%d\n", item);
    return 0;
}
#include <stdio.h>

int main(void) {
    int values[4] = {2, 4, 6, 8};
    int offset = 3;
    int *base = values;
    int item = *(base + offset);

    printf("item=%d\n", item);
    return 0;
}
  1. values ← ⟨addr A⟩, offset ← 2, base ← ⟨addr A⟩, item ← 6

    3int main(void) {4    int values→ ⟨addr A⟩[4] = {2, 4, 6, 8};5    int offset→ 2 = 2; //@offset=1, 36    int *base→ ⟨addr A⟩ = values⟨addr A⟩;7    int item→ 6 = *(base⟨addr A⟩ + offset2);89    printf("item=%d\n", item6);10    return 0;11}
    outputitem=6
  1. values ← ⟨addr A⟩, offset ← 1, base ← ⟨addr A⟩, item ← 4

    3int main(void) {4    int values→ ⟨addr A⟩[4] = {2, 4, 6, 8};5    int offset→ 1 = 1;6    int *base→ ⟨addr A⟩ = values⟨addr A⟩;7    int item→ 4 = *(base⟨addr A⟩ + offset1);89    printf("item=%d\n", item4);10    return 0;11}
    outputitem=4
  1. values ← ⟨addr A⟩, offset ← 3, base ← ⟨addr A⟩, item ← 8

    3int main(void) {4    int values→ ⟨addr A⟩[4] = {2, 4, 6, 8};5    int offset→ 3 = 3;6    int *base→ ⟨addr A⟩ = values⟨addr A⟩;7    int item→ 8 = *(base⟨addr A⟩ + offset3);89    printf("item=%d\n", item8);10    return 0;11}
    outputitem=8