Para exercitar vamos criar um novo problema: Criar um função que duplique qq valor colocado pelo utilizador:
Programar em C/Ponteiros 73
#include <iostream> using namespace std;
void doubleIt(int&);//prototype com endereço de variavel int main ()
{
int num;
cout << "Enter number: "; cin >> num;
doubleIt(num); //chamo função, passando parametro num cout << "The number doubled in main is " << num << endl;
system ("pause"); return 0;
}
void doubleIt (int& x) {
cout << "The number to be doubled is " << x << endl;
x *= 2;
cout << "The number doubled in doubleIt is " << x << endl;
}
#include <iostream> using namespace std;
void doubleIt(int*); //parametro por endereço int main ()
{
int num;
cout << "Enter number: "; cin >> num;
doubleIt(&num);//passei parametro como endereço cout << "The number doubled in main is " << num << endl;
system (pause); return 0; }
void doubleIt (int* x) {
cout << "The number to be doubled is " << *x << endl;
*x *= 2;
cout << "The number doubled in doubleIt is " << *x << endl;
}
Ou seja nestes dois códigos temos uma passagem por referência e outro por endereço. Com diferenças: • Na chamada da função (dentro do main() )
doubleIt(num); // by reference doubleIt(&num); // by address
• No prototype da função (confirmar o ponto e virgula) void doubleIt(int&); // by reference void doubleIt(int*); // by address • Na function header
void doubleIt (int& x) // by reference void doubleIt (int* x) // by address • dentro do body function (dentro da própria função) x
*x
Podemos pensar que passando por referência parece ser muito mais simples do que passado por address. Na verdade existem algumas vertas funções da biblioteca que só permitem a passagem por address.
Programar em C/Ponteiros 74
Referências
Este livro tem a seguinte tarefa pendente: Mover este tópico para o livro de C++
As referências actuam como nomes alternativos para o alvo. dito de outra forma: "chamei 'a' aquela porção de memória, pois bem, agora para além de se chamar 'a', também se pode chamar de 'b'". Para criar uma referência basta colocar o operador de referência & antes do nome de referência. int &referencia= some int
Note: o operador de referência não é igual ao operador de address, mas estão relacionados. Tudo depende é do contexto. Como já vimos antes com o *. é um dos grandes trunfos da linguagem c++. Assim permite que tenhamos de decorar menos coisas
Exemplo #include <iostream> using namespace std; int main() { int val = 1; int &ref = val;
cout << "val is " << val << endl; cout << "ref is " << ref << endl; cout << "Setting val to 2" << endl; val = 2;
cout << "val is " << val << endl; cout << "ref is " << ref << endl; cout << "Setting ref to 3" << endl; ref = 3;
cout << "val is " << val << endl; cout << "ref is " << ref << endl; system ("pause");
return 0; }
Como se viu conseguimos alterar o valor de val alterando o valor de ref.
Afinal de contas é dar mais um nome á variavel!! e podemos acrescentar muitos mais. e pois até podemos declarar as reference através de outras já criadas, por exemplo no exemplo anterior bastava fazer int &a=ref; ou se quisermos int &a=val;
Existe apenas umas restrições para o seu uso:
• Teremos de inicializar, ie, no momento da declaração teremos de atribuir de imediato o valor. (se não fizermos isso dá erro de compilação)
• As reference não podem ser reassigned, ou seja eu no exemplo anterior tinha
int &ref = val; se mais tarde no código tentar-se fazer int &ref=m; (sendo m uma variável já declarada e iniciada por hipótese) o que acontece é que a 2ª instrução é completamente ignorada e ficamos sempre com a primeira. Bem na verdade deu erro de compilação. Bem deve ser da categoria do compilador
A real vantagem dos references é que quando elas são usadas para passar valores para as funções elas providenciam uma maneira de retornar valores das funções.
Programar em C/Ponteiros 75 #include <iostream> using namespace std; int main() { int val1 = 10; int val2 = 20; int &ref = val1;
cout << "val1 is " << val1 << endl; cout << "val2 is " << val2 << endl; cout << "ref is " << ref << endl; ref = val2; //What does this do? cout << endl << "ref = val2" << endl; cout << "val1 is " << val1 << endl; cout << "val2 is " << val2 << endl; cout << "ref is " << ref << endl; val2 = 30;
cout << endl << "Setting val2 = 30" << endl; cout << "val1 is " << val1 << endl;
cout << "val2 is " << val2 << endl; cout << "ref is " << ref << endl; system ("pause");
return 0; }
Programar em C/Tipos de dados definidos pelo usuário 76