2010-04-01 12 views

Respuesta

27

Se pasan como punteros. Esto significa que se pierde toda la información sobre el tamaño de la matriz. Se recomienda mucho más el uso de std :: vectores, que se pueden pasar por valor o por referencia, según lo que elija, y que, por lo tanto, conservan toda su información.

Aquí hay un ejemplo de pasar una matriz a una función. Tenga en cuenta que debemos especificar el número de elementos específicamente, ya que sizeof (p) daría el tamaño del puntero.

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); 
} 
+0

Gracias Neil, pero como mencioné en una de mis publicaciones de ayer, actualmente estoy trabajando en excersizes desde TC++ PL y tengo que usar matrices oridinarias. Me preguntaba si es necesario escribir algo como: void f (int (& a) [size]); o es solo suficiente para declarar como una matriz sin ref. –

+0

Así que básicamente a juzgar por esta respuesta pasaron por valor que es el tamaño de un puntero. ¿Estoy en lo cierto? –

+1

@ una buena razón para no aprender C++ de TC++ PL, en mi humilde opinión. –

5

Las matrices son especiales: siempre se pasan como un puntero al primer elemento de la matriz.

23

En primer lugar, no puede pasar una matriz por valor en el sentido de que se realiza una copia de la matriz. Si necesita esa funcionalidad, use std::vector o boost::array.

Normalmente, un puntero al primer elemento se pasa por valor. El tamaño de la matriz se pierde en este proceso y se debe pasar por separado. Las firmas siguientes son 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! 

Si desea pasar por referencia, el tamaño es parte del tipo:

void by_reference(int (&a)[7]); // only arrays of size 7 can be passed here! 

A menudo se combinan pase por referencia con las plantillas, por lo que se pueden utilizar la función con diferentes tamaños estáticamente conocidos:

template<size_t size> 
void by_reference(int (&a)[size]); 

Espero que esto ayude.

Cuestiones relacionadas