Programação
› Algoritmo › C/C++ › Java
Web
› HTML/XHTML › JavaScript › PHP
Sistema Operacional
› Comandos de DOS › Windows › Linux › Mac/BSD
Office
› Word / Writer › Excel / Calc
Áreas do Site
› Download › Fórum › Blog
|
Ponteiros como Argumento de FunçõesVimos até agora, qual a importância dos ponteiros, como utilizá-los e principalmente qual sua sintaxe. Agora, começaremos a tratar de ponteiros em tópicos mais avançados, começando com o uso de ponteiros como argumento de funções. Primeiramente, iremos entender qual a vantagem de usarmos ponteiros como argumentos. Até agora, apenas havíamos utilizado argumentos de valores. Os argumentos de valores são cópias dos valores dos dados passados a função em sua chamada. Exemplo: #include <iostream>
using namespace std;
int mostrarNumero (int nr) {
cout << nr << endl;
}
int main (void) {
int n = 10;
mostrarNumero(n);
system("pause");
}
No exemplo acima, quando passamos a variável n para a função Isso nos impossibilita de acessar a variável diretamente, fazendo com que muitas vezes tenhamos que forçar nossa função retornar algum valor. O problema está quando criamos uma função que afeta diretamente várias partes da memória. Neste caso, não é possível apenas retornarmos um valor para ser tratado novamente dentro do corpo do programa. Abaixo esta um exemplo muito simples, mas que simplesmente não atende a nossas expectativas. #include <iostream>
using namespace std;
int trocar (int a, int b) {
int aux;
aux = a;
a = b;
b = aux;
}
int main (void) {
int var1 = 10, var2 = 50;
trocar (var1, var2);
cout << "O valor de var1 e " << var1 << endl;
cout << "O valor de var2 e " << var2 << endl;
system("pause");
}
A idéia da função acima é passar o valor de uma variável para outra. Mas, ao executarmos este código, percebemos que ao final os valores de var1 e var2 continuam os mesmos. Por quê? Simples. O que foi trocado dentro da função trocar foi a cópia dos valores de var1 e var2 que são a e b dentro da função. Ou seja, o que foi alterado na verdade foi o valor de a que passou para b e b que passou para a. A troca aconteceu, mas não com as variáveis que queríamos. Mas, se ao invés de utilizarmos o valor da variável, utilizássemos sua referência de memória, ou seja, o seu ponteiro. Dessa forma, a função saberia que o valor a ser tratado já existe e está exatamente no local da memória que indicarmos. Portanto, o valor que seria tratado dentro da função não seria uma cópia, mas a variável original. Então, vamos reformular a função do exemplo anterior usando a referência dos ponteiros (endereços contidos nos ponteiros) como argumentos dessa vez. #include <iostream>
using namespace std;
int trocar (int &a, int &b) {
int aux;
aux = a;
a = b;
b = aux;
}
int main (void) {
int var1 = 10, var2 = 50;
trocar (var1, var2);
cout << "O valor de var1 e " << var1 << endl;
cout << "O valor de var2 e " << var2 << endl;
system("pause");
}
Neste caso, usamos o endereço como forma de manipulação, e então, conseguimos trocar os valores de var1 e var2, pois a função não copiou os valores dessas variáveis, ele manipulou diretamente seus endereços de memória. Aqui, podemos destacar mais uma vatangem que foi a economia de memória. Pois, não foi criado mais um espaço de memória, já que nós utilizamos diretamente o endereço de memória já alocado anteriormente por var1 e var2.
Páginas Relacionadas |
Enquete
|