O post Ponteiros em C++ descreve o que é um ponteiro, como o mesmo funciona e seu comportamento na memória do computador. O post também demonstra quais são os operadores existentes na linguagem C++ para se trabalhar com Ponteiros.
Ponteiros em C++
Ponteiro é uma variável que armazena um endereço de memória. O endereço de memória alocado pelo ponteiro representa um local na memória do computador que pode pode ser utilizado para armazenar tipo de dados, como por exemplo: Inteiro, Float, String. No caso da declaração das variáveis convencionais, exemplo: int i, o sistema operacional se encarrega de alocar na memória do computador o espaço necessário para armazenar o tipo de dado declarado e “marcar” aquele espaço da memória com um nome, o qual é representado pelo nome da variável. O papel do ponteiro é armazenar exatamente o endereço alocado pelo sistema.
Como ponteiros guardam endereços de memória, pode-se armazenar qualquer endereço de memória, mesmo que este endereço não tenha sido reservado no início da execução do programa. Pode-se declarar ponteiros ou usar referenciamento e dereferenciamento. Ponteiros são declarados como se fossem variáveis, mas contendo um indicador (que é um asterisco).
Declaração de Ponteiros
float *ponteiroFloat
int *ponteiroInt
Referência
Referência é quando nos referimos diretamente ao identificador do endereço da memória. A memória é na verdade uma grande tabela com células sequenciais, cada célula tem seu próprio endereço que segue um padrão contínuo. Ou seja, a primeira célula será 0x00000000, a segunda 0x00000001, a terceira 0x00000002, e assim por diante.Quando fazemos referência, estamos obtendo o endereço da célula na memória.
A referência é dada pelo operador &.
O código fonte ilustrar o uso da referência:
#include <iostream>
#include <cstdlib>
using namespace std;
int main (){
int var1 = 100;
int *ptr1;
ptr1 = &var1;
cout << ptr1 << endl;
system (“pause”);
}
Para isso, foi criado uma variável do tipo int denominada var1 e um ponteiro para int denominado ptr1. Foi atribuído o valor 100 para a variável var1 e para a variável ptr1 o endereço de memória de var1 (&var1). Ao exibir o valor contido em ptr1, será exibido o endereço de memória 0x “algum hexadecimal” alocado na mesma.
Dereferência
Dereferência é quando nos referimos ao valor contido no endereço armazenado, ou seja, é o contrário da operação de referência. A dereferência busca o valor que está no endereço gravado no ponteiro, isso quer dizer que o valor obtido não está no ponteiro, mas no endereço que ele aponta.
A dereferência é dada pelo operador *.
Ainda usando o exemplo da variável var1 veja o exemplo de código fonte:
#include <iostream>
#include <cstdlib>
using namespace std;
int main (){
int var1 = 100;
int *ptr1;
ptr1 = &var1;
cout << “O valor contido no endereco de memoria “;
cout << ptr1 <<” e “<< *ptr1 << endl;
system (“pause”);
}
No caso do código fonte descrito anteriormente, o comando cout exibe o valor contido no endereço alocado pela variável ptr1. Observação (Não é exibido o valor armazenado na variável ptr1 e sim o valor armazenado no endereço salvo na variável ptr1). A imagem a seguir ilustra o código fonte de um programa e como as variáveis se comportam na memória principal do computador.
O código fonte possui duas variáveis do tipo inteiro, um vetor do tipo inteiro com duas posições e um ponteiro para inteiro. O ponteiro armazena o endereço da variável b, o qual foi obtido pela operação de referência. Por meio do comando cout é exibido na tela:
- O endereço da variável a;
- O valor da variável a;
- O endereço da variável b;
- O valor da variável b;
- O endereço na memória alocado para a posição 1 do vetor;
- O valor contido na posição 1 do vetor;
- O endereço na memória alocado para a posição 0 do vetor;
- O valor contido na posição 0 do vetor;
- O endereço de memória da variável pt;
- O valor contido na variável pt;
Alocação de memória
Alem de utilizarmos o endereço de memória de outra variável, é possível alocar um espaço de memória para um ponteiro, isto é muito quando se deseja alocar dinamicamente memória para usar como variáveis do programa. Em C++, a alocação é feita por meio do operador new e a liberação da memória é feita pelo operador delete.
No exemplo a seguir, pode-se observar o uso das funções new e delete:
#include <iostream>#include <cstdlib>using namespace std;int main (){int *ptr;ptr = new int; //aloca memóriacout << “Valor contido em ptr” << endl;cout << ptr << endl;cout << “Valor armazenado no endereço contido em ptr” << endl;cout << *ptr << endl;delete ptr; //libera memóriasystem (“pause”)}