Arrays como parámetros en C: ejercicio resuelto

Arrays como parámetros en C: ejercicio resuelto

Si buscas arrays como parámetros en C ejercicio resuelto, aquí tienes el patrón fundamental: en C los arrays se pasan a funciones como un puntero al primer elemento, lo que significa que la función puede modificar el array original y que el tamaño debe pasarse por separado.

Este comportamiento —denominado decaimiento a puntero— es uno de los primeros puntos de confusión para quien viene de Java o Python, donde los arrays llevan su tamaño consigo.

Enunciado

Escribe tres funciones:

  1. rellenar(arr, n): rellena el array con los valores 0, 2, 4, …, 2*(n-1).
  2. suma(arr, n): devuelve la suma de todos los elementos (sin modificar el array).
  3. imprimir(arr, n): imprime todos los elementos separados por espacios.

Demuestra que las modificaciones de rellenar son visibles en main.

Solución en C

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>

void rellenar(int arr[], int n) {
    for (int i = 0; i < n; i++) arr[i] = i * 2;
}

int suma(const int arr[], int n) {
    int s = 0;
    for (int i = 0; i < n; i++) s += arr[i];
    return s;
}

void imprimir(const int arr[], int n) {
    for (int i = 0; i < n; i++) printf("%d ", arr[i]);
    printf("\n");
}

int main(void) {
    int v[5];
    rellenar(v, 5);
    imprimir(v, 5);
    printf("Suma: %d\n", suma(v, 5));
    return 0;
}

Resultado esperado

1
2
0 2 4 6 8 
Suma: 20

Errores frecuentes

  • Intentar obtener el tamaño del array dentro de la función con sizeof(arr): devuelve el tamaño del puntero (8 bytes en 64 bits), no el del array. El tamaño siempre debe pasarse como parámetro.
  • Olvidar const en funciones que solo leen el array: el compilador no puede optimizar ni detectar modificaciones accidentales.
  • Pasar &v en lugar de v: &v es un puntero a array (int (*)[5]), tipo diferente al esperado por la función.
  • Confundir arrays en la pila (int v[5]) con arrays dinámicos (malloc): ambos se pasan como puntero, pero el ciclo de vida es distinto.

Aplicación práctica

El paso de arrays a funciones es la base de algoritmos de ordenación, búsqueda y transformación en C. Separar la lógica en funciones con const permite al compilador aplicar optimizaciones y al programador razonar mejor sobre los efectos secundarios.

Siguiente ejercicio recomendado

Práctica guiada y libro completo

Si quieres una ruta completa con progresión real de dificultad:

FAQ

¿Por qué sizeof(arr) dentro de la función no da el tamaño del array?

Porque cuando un array se pasa a una función, se decae a un puntero al primer elemento. La función recibe solo la dirección de memoria, no la longitud. sizeof de un puntero devuelve el tamaño del puntero (4 u 8 bytes según la arquitectura).

¿Qué diferencia hay entre int arr[] e int *arr como parámetro de función?

Ninguna en la práctica: ambas declaraciones son equivalentes en el contexto de parámetros de función. C las trata exactamente igual. Se prefiere int arr[] por claridad semántica.

¿Cómo pasar un array de dos dimensiones a una función?

Para matrices, hay que especificar el número de columnas: void f(int mat[][COLS], int filas). Las columnas deben ser constantes conocidas en tiempo de compilación, o usar punteros a puntero para dimensiones dinámicas.