elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Arreglos como parametros ...
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Arreglos como parametros ...  (Leído 2,029 veces)
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Arreglos como parametros ...
« en: 3 Enero 2019, 22:11 pm »

Hola amigos.

Una consulta, yo tengo entendido que en C++ los arreglos son como punteros, es decir, se apunta a la posición de memoria del primer indice en adelante hasta donde termina el array en la cantidad de bytes que ocupa por el tipo... vale

Que sucede en este caso ?

Código:
int main (){
int misNumeros[] = {0, 4, 1, 8, 3, 9};
OrdenaMayorAMenor(misNumeros);
}

void OrdenarMayorAMenor(int números[]){
//..blablabla

}

Que estoy haciendo aquí?.. estoy copiando el valor (duplicando el vector) ?
como puedo optimizar el uso de la memoria?.. puedo usar referencia o puntero aquí en el parámetro?

gracias.


En línea

Dungeons & dragons;
dragons.Attack();
fary


Desconectado Desconectado

Mensajes: 1.084



Ver Perfil WWW
Re: Arreglos como parametros ...
« Respuesta #1 en: 3 Enero 2019, 23:13 pm »

Estas pasando el puntero a la función... Si modificas el array desde la funcion OrdenaMayorAMenor el cambio también se vera reflejado desde la función main.


Ejemplo:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void OrdenaMayorAMenor(int numeros[])
  5. {
  6.    numeros[0] = 5;
  7. }
  8.  
  9. int main()
  10. {
  11.    int misNumeros[] = {7, 4, 1, 8, 3, 9};
  12.    OrdenaMayorAMenor(misNumeros);
  13.  
  14.    printf("%i\n",misNumeros[0]);
  15.  
  16.    return 0;
  17. }
  18.  


saludos.


En línea

Un byte a la izquierda.
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Arreglos como parametros ...
« Respuesta #2 en: 3 Enero 2019, 23:27 pm »

Para entender eso debes tener muy claro qué es una variable.

Una variable es una zona de memoria que alguien te ha dejado para que pongas cosas dentro. ¿Puedes cambiar esa zona de memoria? No, pero puedes cambiar lo que hay dentro.

Para verlo veamos un escalar, un int (4 bytes). Supongamos que el sistema te da la dirección 100 para tu variable, podrías hacer esto:
100: 0x00
101: 0x01
102: 0xFF
103: 0x00

Cómo puedes intuir el cambiar la dirección de los datos es absurdo, la memoria es la que es, es algo físico. Si acaso puedes copiar el contenido en otro sitio pero tienes que dar otro nombre a ese otro sitio para referenciarte a él.

Vayamos ahora a por los punteros, esas variables que contienen direcciones de memoria. Al igual que los escalares son variables y esto significa que están ancladas en una dirección de memoria. De la misma forma contienen números pero estos representan otras direcciones de memoria, y por contener direcciones de memoria tienen una aritmética especial; por lo demás son como escalares.

Las variables (escalares y punteros) devuelven su contenido, es decir: dónde C/C++ vea su nombre lo traducirá por su contenido.

Los arrays son una bestia extraña, una quimera. Un array es una ristra de elementos iguales contiguos. Supongamos un array de cuatro int y que éste empieza en la dirección de memoria 100:
100: 0x123847
104: 0x1038
108: 0x77483
112: 0x0

Cómo ves, al igual que los escalares cada elemento ocupa una dirección física que no se puede cambiar. Por tanto a un array no se le puede cambiar de dirección.
Pero a diferencia de los escalares están compuestos de muchos objetos, no sólo uno así que ¿cómo haces referencia a ellos? Para eso podrías hacer que el nombre del array devolviera su dirección de inicio y aplicar aritmética de punteros para referenciar a cada elemento. Así si tu array se llama miArray tendrías que:
miArray: devuelve 100 (igual que miArray+0)
miArray+1: devuelve 104 (recordar que un tipo entero son 4 bytes, aquí 100, 101, 102 y 103)
miArray+2: devuelve 108
miArray+3: devuelve 112

Y ya que tienen aritmética de punteros se dereferencian direcciones de memoria cómo los punteros:
*(miArray+2): devuelve 0x77483
En notación de array:
miArray[2]: devuelve 0x77483

Y esta es la razón por la que los índices de array empiezan por 0. Por otra parte y muy a tener en cuenta: el nombre del array devuelve su dirección de inicio.

Respondiendo a tu pregunta:
Ya has visto que los arrays devuelven su dirección por tanto cuándo pasas por parámetro un array lo que haces realmente es pasar su dirección así que no hay copia por valor de todo el array.

Pero la cosa se complica. ¿Qué ocurre cuándo pasas un array? Verás que el argumento del receptor debe dimensionar todas las dimensiones menos la primera. Algo así:
Código:
void miFuncion(int cubos[][100][100][100]);
El array recibe una colección de cubos.
¿Porqué la primera dimensión no está definida? Pues porque puede que tengas una colección de 1 de 100 o de 1000 cubos.
¿Y porqué las otras dimensiones sí están especificadas? C/C++ debe saber cuánto tiene que moverse por memoria cuándo des un índice. Por ejemplo:
La diferencia de memoria entre cubos[0] y cubos[1] es (1-0)*sizeof(int)*100*100*100.
La diferencia de memoria entre cubos[0][0][3][0] y cubos[0][0][5][0] es (5-3)*sizeof(int)*100.
En línea

digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Arreglos como parametros ...
« Respuesta #3 en: 6 Enero 2019, 16:19 pm »

Hola, gracias por responder... MAFUS, agradezco el tiempo que te has hecho en la explicación, aunque eso ya lo tenía claro, tenía mas que nada la duda de como se pasaba realmente el arreglo, pero tiene sentido, porque al pasar solo el nombre del arreglo en realidad uno está pasando la memoria, es una referencia automática...

Saludos y gracias nuevamente a ambos
En línea

Dungeons & dragons;
dragons.Attack();
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Parametros de entrada, arreglos bidimensionales « 1 2 »
.NET (C#, VB.NET, ASP)
greenselves 13 11,433 Último mensaje 16 Marzo 2010, 05:45 am
por [D4N93R]
Bash; Pasaje de arreglos como parametros a funciones
Scripting
astinx 1 5,257 Último mensaje 29 Octubre 2011, 20:24 pm
por astinx
Como ingresar dos strings como parametros en una funcion
Programación C/C++
SNP 5 3,913 Último mensaje 17 Mayo 2012, 20:07 pm
por exel
COMO DECLARAR ARREGLOS EN JAVA
Java
jrkikey 3 3,062 Último mensaje 27 Noviembre 2012, 09:34 am
por тαптяα
no se como hacer una función correctamente con arreglos
Programación C/C++
condor7000 5 3,008 Último mensaje 6 Diciembre 2016, 23:45 pm
por jvm1994
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines