C++ y arrays en funciones.

Previous topic - Next topic

mentalthink

Quería haceros está pregunta, en GLBasic, creo que los arrays se pasan por referencia... pero en C++ real no es así no?¿.
Es por copia o por referencia?¿, la duda me viene de libros que hay algunos que dicen que es por copia y otros que dicen que es por referencia, y la verdad no se muy bien como mirar ese asunto.

Supongo que si puedes usar el & en arrays es que es para pasar por referencia y si no es por copía, pero simplemente quería la opinión de gente como vosotros que sabéis mucho más que yo en temas de programación...

Gracias.

hardyx

#1
En GLBasic los arrays son objetos, y por eso se usan referencias.

En C y C++ los arrays son punteros al primer elemento, es decir es igual poner "int enteros[]", que "int *enteros". Cuando se pasa un array a una función realmente estás pasando un puntero al inicio y el tipo de los elementos, que ya lo sabe el compilador por la función. Al pasar la dirección, no hay copia y si cambias el array en la función cambias el array original. Por eso C/C++ es tan eficiente, si se usa bien claro, aunque también puedes liarla bien :D

El operador &, delante de una variable da la dirección, pero delante de un parámetro de función en C++ permite pasar una referencia. No uses la referencia con arrays en parámetros de función, sino un puntero al tipo de elemento. Por ejemplo: int GetMediaValores(int *valores) { .... }, dentro de la función usarías valores[indice] normalmente, ya que un array es un puntero.

Por ejemplo, en la función scanf se pasan punteros (&) a los valores a rellenar, pues bien cuando se usan cadenas, que son arrays de carácteres no hay que poner el & porque una cadena ya es una dirección, es decir un puntero a su primer carácter.

Ejemplo: 
Code (glbasic) Select
  int edad;
  char nombre[100];

  printf("Dime tu nombre:");
  scanf("%s", nombre);    // <-- no va con &
  printf("Dime tu edad:");
  scanf("%d", &numero);    // <-- si va con &
  printf("Hola %s", nombre);


mentalthink

Gracias Hardyx, no había visto tú respuesta... me queda solucionada, ahora ando con otros lios que se explican en C++11 (joder es enrebesao el lenguaje de cojo...) , con punteros inteligentes y compartidos y la verdad que hay cosas que son un follón de la leche, pero bueno chino, chano ... Ya lo iré pillando como todo esto que explicas en el post, aún recuerdo el principio con los punteros  =D =D ...

Saludotes.