Duda punteros y referencias c++

Iniciado por Mozzard, 23 Enero 2019, 20:50 PM

0 Miembros y 1 Visitante están viendo este tema.

Mozzard

Es una cosa sencilla que queria probar para testearlo y jugar un poco con ello para tener soltura, y no me compila lol, alguien sabe por que?
#include "pch.h"
#include <iostream>
using namespace std;
void refuncion(int&);
int main()
{
int* pnum;
*pnum = 5;
refuncion(&pnum);
}
refuncion(int& ref) {
cout << "El numero es: " << ref << endl;
}
Programalo... sin miedo...

ivancea96

Código (cpp) [Seleccionar]
refuncion(&pnum);

Con eso estás pasando como parámetro la dirección del puntero, es decir, un int** (dirección de una dirección).
Sin embargo, en la función esperas un int&. El uso de "&" antes de una variable es diferente a su utilidad después de un tipo. Para que esto compilase, deberías pasarle a la función "*pnum" (es decir, un int). "int&" es una referencia a un int, es decir, lo que le hagas al parámetro "ref" será como hacérselo a "*pnum".

Aunque este código compile, habrá un error, y es que al hacer "*pnum = 5" estás diciendo que "la variable a la que apunta "pnum" se establecerá a 5. El problema, es que "pnum" no apunta a ninguna variable.

Puedes hacer este cambio:

Código (cpp) [Seleccionar]
int num = 5;
int* pnum = &num;
// ...

MAFUS

Lo que viene siendo ...

Premisa: una variable local sin inicializar puede tener cualquier valor.
Cuando generas el puntero local tiene un valor desconocido, pero al fin y al cabo un valor (por lo que apuntará a algún lugar desconocido).

Premisa: tocar una dirección de memoria fuera del marco que le ha dado el sistema operativo a tu programa hará que este lo detenga por seguridad.
Al dar un valor a la dirección de memoria apuntada por tu puntero estás intentando modificar ve a saber dónde que seguramente no te esté permitido. Por tanto el S.O. detiene tu programa.

Fin.