DMarlon Studio

Lección 16 · 16 de 20

Punteros y arrays · C

Descubra la relación entre punteros y arrays en C: el nombre del array como dirección, la aritmética de punteros y arrays como parámetros.

C · Punteros y arrays en DMarlon Studio: el código del ejemplo y su salida en la terminal

El nombre de un array funciona como la dirección de su primer elemento: int *p = marks; hace que p apunte a marks[0], sin necesidad de &. Por eso *p es 6.

Con la aritmética de punteros, p + 1 apunta al elemento siguiente, no al byte siguiente: C avanza el tamaño de un int. *(p + 1) es 8, y p[2] es solo otra forma de escribir *(p + 2). El for con q recorre el array moviendo un puntero desde marks hasta marks + n, justo pasado el final.

Cuando se pasa un array a una función, lo que viaja es esa dirección. Por eso la función no sabe cuántos elementos hay y hay que pasarle también count. Y por eso add_bonus sí cambia el array original, a diferencia de lo que ocurre con un int normal: todas las notas suben un punto.

En average, el parámetro es const double *values: `const` promete que la función solo leerá el array, y el compilador avisaría si intentara cambiarlo. Es una buena costumbre en funciones que solo consultan.

Código · main.c

#include <stdio.h>// An array parameter is really a pointer, so pass the length too.double average(const double *values, int count) {    double sum = 0;    for (int i = 0; i < count; i++) sum += values[i];    return sum / count;}// Through the pointer, the function changes the original array.void add_bonus(int *marks, int count, int bonus) {    for (int i = 0; i < count; i++) marks[i] += bonus;}int main(void) {    int marks[] = {6, 8, 5, 9, 7};    int n = sizeof(marks) / sizeof(marks[0]);    int *p = marks;  // the array name is the address of marks[0]    printf("*p = %d, *(p + 1) = %d, p[2] = %d\n", *p, *(p + 1), p[2]);    // p + 1 moves one element forward, not one byte.    for (int *q = marks; q < marks + n; q++) printf("%d ", *q);    printf("<- marks\n");    add_bonus(marks, n, 1);    for (int i = 0; i < n; i++) printf("%d ", marks[i]);    printf("<- after the bonus\n");    double temps[] = {12.5, 15.0, 9.5};    printf("Average temperature: %.2f\n", average(temps, 3));    return 0;}

Salida · cc main.c -o main && ./main

*p = 6, *(p + 1) = 8, p[2] = 5
6 8 5 9 7 <- marks
7 9 6 10 8 <- after the bonus
Average temperature: 12.33

Para recordar

  • El nombre de un array es la dirección de su primer elemento.
  • p + i avanza i elementos; p[i] es *(p + i).
  • Una función que recibe un array recibe un puntero: pásele también el tamaño.
  • La función puede cambiar el array original.
  • const en el parámetro indica que solo se va a leer.

Ejercicio

Escriba int find_max(const int *values, int count) que devuelva la posición de la nota más alta, y úsela para escribir esa nota tras el bonus.