Conservação de valor usando ponteiros[RESOLVIDO]

#include <iostream>
#include <stdlib.h>
using namespace std;

int retornaPonteiro1(int &num)
{
    return num + 1;
}
int retornaPonteiro2(int &num)
{
    return num + 2;
}
int retornaPonteiro3(int &num)
{
    return num + 3;
}

int main()
{
    int n = 11;
    int *p = &n;
    int pFN[2] = {};

    pFN[0] = retornaPonteiro1(*p);
    pFN[1] = retornaPonteiro2(*p);
    pFN[2] = retornaPonteiro3(*p);

    cout << "pFN 1 -> " << pFN[0] << endl;
    cout << "pFN 2 -> " << pFN[1] << endl;
    cout << "pFN 3 -> " << pFN[2] << endl;
    cout << "pN -> " << n << endl;

    system("pause");
    return 0;
}

Existe alguma forma de fazer com que a variável n permaneca com o valor 11, enquanto o ponteiro sirva de referencia para as funções, alterando o valor somente do ponteiro?

Se você altera o valor de um ponteiro e o endereço de memória para onde esse ponteiro aponta é de outra variável, o valor da variável também vai mudar. Não tem como evitar isso, a não ser alocando mais memória.

Se você não quer que o valor do ponteiro esteja ligado a n, porque você associa os dois ao invés de copiar o valor de n para o ponteiro?

O seu exemplo não precisa de ponteiro nem referência pra funcionar. Pode fazer um outro exemplo que mostre o que você quer fazer?

#include <iostream>
#include <stdlib.h>

using namespace std;

int retornaPonteiro1(int num)
{
    return num + 1;
}
int retornaPonteiro2(int num)
{
    return num + 2;
}
int retornaPonteiro3(int num)
{
    return num + 3;
}

int main()
{
    int n = 11;
    int pFN[3] = {};

    pFN[0] = retornaPonteiro1(n);
    pFN[1] = retornaPonteiro2(n);
    pFN[2] = retornaPonteiro3(n);

    cout << "pFN 1 -> " << pFN[0] << endl;
    cout << "pFN 2 -> " << pFN[1] << endl;
    cout << "pFN 3 -> " << pFN[2] << endl;
    cout << "pN -> " << n << endl;

    system("pause");
    return 0;
}

Talvez eu esteja inventando moda. Mas até agora não consigo compreender a utilidade de ponteiros hoje em dia. Me disseram aqui no GUJ que eu poderia passar como parâmetro das funções uma referencia da posição de memoria e não a cópia da variável, por que essa prática consome menos memória. Talvez isso servisse para computadores de antigamente com pouco recursos de RAM. Será que hoje em dia com máquinas mais potentes se faria necessário o uso de ponteiros?

A questão consumo de memória relacionado a ponteiros é apenas um “plus”, a principal função de um ponteiro você mesmo já disse, servir de referência…

Imagine um cenário da vida real…

Costumamos guardar arquivos em um armário (memória), onde cada gaveta possui seus arquivos específicos separadamente por categorias por exemplo (ponteiro), quando você usa um arquivo (funções por exemplo), vai buscá-lo na gaveta pela referência (ponteiro) correto?

Agora imagine você precisando informar essa referência para outras pessoas usarem (outras funções), você não precisa passar o arquivo para elas, apenas sua referência, você otimizou suas tarefas e facilitou a comunicação…

As tecnologias atuais não interferem em nada a questão do uso da memória, porque a gaveta continua armazenando os aquivos corretos, a diferença é que mais memória, podemos guardar mais categorias de arquivos, pegou a idéia?

É muito mais rápido passar uma referência para um objeto na memória do que copiar o objeto inteiro.

Se você carregar 1GB de dados para uma estrutura em memória você vai ficar copiando esses dados cada vez uma função precisar operar sobre eles ?

Até aqui entendi. Compreendo que ponteiros, servem para referenciar dados grandes na memória, por exemplo um arquivo XML de um WebService, aonde todos os objetos consumidores poderão ter acesso através de uma referencia. Valeu pelas informações caros colegas.