Como passar arrays para funções em C, e sua relação com ponteiros.
sizeof na função chamada dá o tamanho do ponteiro, não do arrayint a[n] (C99)const para marcar como somente leiturasizeof(a) dá o tamanho do ponteirovoid 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.
// Duas formas equivalentes de parâmetro 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; }
int e double são passados como cópia do valor, mas arrays são passados como o endereço do primeiro elemento.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 também 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 }
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)! }
#define.Teste seu entendimento desta aula.
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.
Como a função trabalha via ponteiro, escrever nos elementos altera o array do chamador também.
Só um ponteiro chega à função, então sizeof não consegue recuperar o tamanho original — passe a contagem como argumento separado.