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
Recomendamos
Computadores e Informática em Lisboa
TI Expert » Programação » C/C++ » Ponteiro Como Argumento de Função

Ponteiros como Argumento de Funções

Vimos 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 mostrarNumero o valor de n é copiado para nr. Ou seja, o valor que está sendo manipulado dentro da função não é o valor original, mas uma cópia.

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.

Creative Commons License
Autor: Denys William Xavier
Este artigo está sob Licença Creative Commons.

Faça o download da versão em PDF Indique nosso site Gostou?
Indique nosso site!
Este artigo foi
lido 34704 vezes
Bookmark e Compartilhe

Páginas Relacionadas

Enquete
O Google Chrome OS irá desbancar o Microsoft Windows 7?
» ProgramaçãoAlgorítmo | C/C++ | Java

» WebHTML/XHTML | JavaScript | PHP

» Sistema OperacionalComandos de DOS | Windows | Linux | Mac/BSD

» OfficeWord/Wirter | Excel/Calc

» Áreas do SiteDownloads | Fórum | Blog