// Arreglos y punteros: a[i] es *(a + i), y un puntero avanza de elemento en elemento.
#include <stdio.h>

int sum_with_index(const int *a, int n) {
    int total = 0;
    for (int i = 0; i < n; i++) {
        total = total + a[i];
    }
    return total;
}

int sum_with_pointer(const int *a, int n) {
    int total = 0;
    for (const int *p = a; p < a + n; p++) {
        total = total + *p;
    }
    return total;
}

void show_size(const int *a) {
    printf("sizeof(a) en la función = %zu\n", sizeof(a));
}

int main(void) {
    int a[4] = {10, 20, 30, 40};

    printf("a[2] = %d, *(a + 2) = %d\n", a[2], *(a + 2));
    printf("a    = %p\n", (void *) a);
    printf("a + 1 = %p\n", (void *) (a + 1));
    printf("a + 2 = %p\n", (void *) (a + 2));

    int *p = a + 1;
    printf("*p = %d, p[0] = %d, p[1] = %d\n", *p, p[0], p[1]);

    int *q = &a[3];
    printf("q - p = %td elementos\n", q - p);

    printf("sumas: %d y %d\n", sum_with_index(a, 4), sum_with_pointer(a, 4));
    printf("desde a[2]: %d\n", sum_with_pointer(a + 2, 2));

    printf("sizeof(a) en main = %zu\n", sizeof(a));
    show_size(a);
    return 0;
}
