Programación General > C/C++

 Operadores De Indirección (*), De Dirección (&)...

<< < (2/3) > >>

Ruben3d:

--- Citar ---Es válido la declaracion de variables referencia en C?


--- Fin de la cita ---

No, es específico de C++. Creo que en la pregunta original se refería al paso de parámetros a funciones "por referencia", cosa que ya he explicado un par de post más arriba (debajo del grandote).

Un saludo.

Ruben3d

CiRRuS:
Ok, en C no me sonaba eso de variables referencia.

:gracias:

Nos vemos :hola:

JoRDi-18:
Hola!

Bueno, antes de nada muchísimas gracias a ambos por molestaros en contestar.

Me ha quedado una pequeña duda:


--- Código: Text ---  // Función desde la que no se puede modificarvoid Func1(int num){   num = num + 1;   printf(&#34;Dentro de Func1: %d&#092;n&#34;, num);} // Función que sí modificavoid Func2(int *num){   *num = *num + 1;   printf(&#34;Dentro de Func2: %d&#092;n&#34;, *num);} // Ejemplo de su usox = 1;Func1(x);                                // Desde aqui dentro se imprimirá 2printf(&#34;Tras llamar a Func1: %d&#092;n&#34;, x);  // Imprimirá 1Func2(&x);                               // Desde aqui se imprimirá 2printf(&#34;Tras llamar a Func2: %d&#092;n&#34;, x);  // Imprimirá 2   
Mirando en este ejemplo.

Cuando llamamos a Func2, estamos pasando por referencia un valor que, tras la ejecución de Func2, cambiará su valor.
Mi duda está en la manera de hacer esto... Equivalentemente, ¿se podría hacer esto?


--- Código: Text ---  // Función desde la que no se puede modificarvoid Func1(int num){   num = num + 1;   printf(&#34;Dentro de Func1: %d&#092;n&#34;, num);} // Función que sí modificavoid Func2(int *num){   num = num + 1;   printf(&#34;Dentro de Func2: %d&#092;n&#34;, *num);} // Ejemplo de su usox = 1;Func1(x);                                // Desde aqui dentro se imprimirá 2printf(&#34;Tras llamar a Func1: %d&#092;n&#34;, x);  // Imprimirá 1Func2(x);                               // Desde aqui se imprimirá 2printf(&#34;Tras llamar a Func2: %d&#092;n&#34;, x);  // Imprimirá 2   
Lo que he hecho es modificar

--- Código: Text --- Func2(&x);  
y también, dentro de Func2:

--- Código: Text --- *num = *num + 1;  

Sólo eso, muchas gracias!

Ruben3d:
Hola.

Ese cambio no funcionará, ya que la declaración de la función indica que hay que pasar un puntero a un entero, no un entero, por lo que hay que obtener su dirección con & . Además, si dentro de la función usas el puntero directamente, sin desreferenciarlo con *, lo que haces es cambiar la dirección de memoria a la que apunta. Por ejemplo, si el puntero vale 0x4DF2 y en esa dirección de memoria hay un int (que es el valor que queremos), al incrementarlo en uno valdrá 0x4DF6 (aumenta 4 bytes, que es el tamaño de un int) y no sabremos a qué está apuntando, por lo que puedes acabar, con suerte, con una violación de segmento y, si no tienes tanta suerte, puede compilar perfectamente, pero modificar el valor de otra variable (imagina para encontrar el fallo).

Espero que esto te lo haya aclarado un poco más.

Un saludo.

Ruben3d

CiRRuS:
Mmm, violación de segmento... jejejeje, lo siento, pero es cuando oigo esa fraso o Segmentation Fault me entra de todo, escalofrío... pena... risa... jejejeje. Aqui eso se aprende a base de palos  :lol:

Te pega un pedazo segmentation fault de cojones, curiosamente, nunca sem e ha dado el caso de tocar memoria que siga siendo "mia", siempre plas! un segmentation fault.

Nos vemos :hola:

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa