Como os arrays são passados?
-
23-09-2019 - |
Pergunta
As matrizes são passadas por padrão por referência ou valor?Obrigado.
Solução
Eles são passados como ponteiros.Isso significa que todas as informações sobre o tamanho do array serão perdidas.Seria muito melhor usar std::vectors, que podem ser passados por valor ou por referência, conforme você escolher, e que, portanto, retêm todas as suas informações.
Aqui está um exemplo de passagem de um array para uma função.Observe que temos que especificar o número de elementos especificamente, pois sizeof(p) daria o tamanho do ponteiro.
int add( int * p, int n ) {
int total = 0;
for ( int i = 0; i < n; i++ ) {
total += p[i];
}
return total;
}
int main() {
int a[] = { 1, 7, 42 };
int n = add( a, 3 );
}
Outras dicas
Primeiro, você não pode passar uma matriz por valor no sentido de que uma cópia da matriz é feita. Se você precisar dessa funcionalidade, use std::vector
ou boost::array
.
Normalmente, um ponteiro para o primeiro elemento é passado pelo valor. O tamanho da matriz é perdido nesse processo e deve ser passado separadamente. As seguintes assinaturas são todas equivalentes:
void by_pointer(int *p, int size);
void by_pointer(int p[], int size);
void by_pointer(int p[7], int size); // the 7 is ignored in this context!
Se você deseja passar por referência, o tamanho faz parte do tipo:
void by_reference(int (&a)[7]); // only arrays of size 7 can be passed here!
Muitas vezes, você combina passa por referência com modelos, para poder usar a função com diferentes tamanhos estaticamente conhecidos:
template<size_t size>
void by_reference(int (&a)[size]);
Espero que isto ajude.
As matrizes são especiais: elas sempre são passadas como um ponteiro para o primeiro elemento da matriz.