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.

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 + iavanzaielementos;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.
consten 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.