Publicidade

Arrays como Argumentos de Função

Como passar arrays para funções em C, e sua relação com ponteiros.

📖 O que aprender nesta página
✅ Essencial saber
  • Passar um array decai para um ponteiro
  • Você tem que passar o tamanho separadamente
  • sizeof na função chamada dá o tamanho do ponteiro, não do array
⭐ Leia se tiver tempo
  • Parâmetros VLA int a[n] (C99)
  • Para arrays 2D, fixe a contagem de colunas
  • Use const para marcar como somente leitura
💪 Não entendeu de primeira? É normal.
A regra "array decai para ponteiro" de C é pouco intuitiva no começo.
Como estudar de novo
  1. Revise arrays e ponteiros
  2. Teste você mesmo: dentro de uma função sizeof(a) dá o tamanho do ponteiro
  3. Regra prática: sempre passe o tamanho como argumento separado
  4. Pule arrays 2D por enquanto — domine os 1D primeiro
💡 Dica: em void f(int a[], int n), int a[] é só outra forma de escrever int *a. A função chamada não consegue ver o tamanho original do array.

Passando um Array para uma Função

Passar um array para uma função usa uma sintaxe de parâmetro um pouco incomum.
// Duas formas equivalentes de parametro
int sumArray(int a[], int n) { ... }
int sumArray(int *a, int n) { ... }

int main(void) {
  int scores[5] = {80,65,92,78,88};
  int total = sumArray(scores, 5); // passa o nome do array (sem &)
  printf("%d\n", total);
}

int sumArray(int a[], int n) {
  int s = 0;
  for(int i=0; i<n; i++) s += a[i];
  return s;
}
Tamanho do array: a função não tem como saber quantos elementos foram passados, então a convenção padrão é passar o tamanho como argumento extra.

Passagem por Valor vs Passagem por Referência

Tipos simples como int e double são passados como cópia do valor, mas arrays são passados como o endereço do primeiro elemento.
Passagem por valor comum (int, double)
Alterações no parâmetro dentro da função não afetam o chamador — só a cópia é modificada.
Passagem de array
Como o endereço é o que é passado, a[i] = 0 dentro da função também muda o array do chamador!
void reset(int a[], int n) {
  for(int i=0; i<n; i++) a[i] = 0; // o array do chamador tambem vira 0
}

int main(void) {
  int x[3] = {1,2,3};
  reset(x, 3);
  printf("%d %d %d\n", x[0], x[1], x[2]); // → 0 0 0
}

A Armadilha do sizeof

Não use sizeof(a) dentro da função! Dentro da função, o parâmetro de array é na verdade um ponteiro, então sizeof te dá apenas o tamanho de um ponteiro (geralmente 8 bytes).
int main(void) {
  int a[5];
  printf("%ld\n", sizeof(a));       // 20 (5 elementos x 4 bytes)
  test(a);
}
void test(int a[]) {
  printf("%ld\n", sizeof(a));       // 8 (tamanho de um ponteiro)!
}
Solução: sempre passe o tamanho como argumento separado, ou compartilhe como constante via macro / #define.

Experimente — Array como Argumento

arr_param.c
Saída
Clique em Executar…
💡 Experimente estas ideias também
Publicidade

Aulas relacionadas

Laços, Arrays, Strings
Arrays
Declarando, inicializando e acessando arrays em C com diagramas de memória.
Avançado
Fundamentos de Ponteiros
Entenda ponteiros com visualização de memória.
Funções
Fundamentos de Funções
Definindo e chamando funções em C, mais parâmetros e valores de retorno.
← Aula anterior
Aula 25: Variáveis Globais
Próxima aula →
Aula 27: Fundamentos de Ponteiros

Teste Rápido

Teste seu entendimento desta aula.

Q1. O que é realmente passado quando você passa um array para uma função?

Uma cópia de todos os elementos
Um ponteiro para o primeiro elemento
O tamanho do array

Em C, o nome do array decai para um ponteiro para seu primeiro elemento, então a função recebe na verdade um endereço.

Q2. O que acontece se você modificar os elementos do array dentro de uma função?

O array do chamador também é modificado
O array do chamador fica inalterado
Erro de compilação

Como a função trabalha via ponteiro, escrever nos elementos altera o array do chamador também.

Q3. Qual a forma correta de informar à função o tamanho do array?

Ela descobre automaticamente com sizeof
Passe o tamanho como argumento separado
Não é necessário passar

Só um ponteiro chega à função, então sizeof não consegue recuperar o tamanho original — passe a contagem como argumento separado.

Compartilhe este artigo
Compartilhar no X Compartilhar no Facebook