C++ Ponteiros com exemplos
โก Resumo Inteligente
Um ponteiro em C++ รฉ uma variรกvel que armazena o endereรงo de memรณria de outra variรกvel. Aqui vocรช aprenderรก como os ponteiros funcionam, como declarรก-los e usรก-los, os operadores de referรชncia e desreferรชncia, ponteiros nulos e suas vantagens.

O que sรฃo ponteiros?
In C++, um ponteiro se refere a uma variรกvel que contรฉm o endereรงo de outra variรกvel. Assim como as variรกveis โโregulares, os ponteiros possuem um tipo de dados. Por exemplo, um ponteiro do tipo inteiro pode conter o endereรงo de uma variรกvel do tipo inteiro. Um ponteiro do tipo caractere pode conter o endereรงo de uma variรกvel do tipo caractere.
Vocรช deverรก ver um ponteiro como uma representaรงรฃo simbรณlica de um endereรงo de memรณria. Com ponteiros, os programas podem simular chamada por referรชncia. Eles tambรฉm podem criar e manipular estruturas de dados dinรขmicas. Em C++, uma variรกvel de ponteiro refere-se a uma variรกvel que aponta para um endereรงo especรญfico em uma memรณria apontada por outra variรกvel.
Endereรงos em C++
Para entender C++ dicas, vocรช deve entender como os computadores armazenam dados.
Quando vocรช cria uma variรกvel no seu C++ programa, รฉ atribuรญdo algum espaรงo na memรณria do computador. O valor desta variรกvel รฉ armazenado no local atribuรญdo.
Para saber o local na memรณria do computador onde os dados estรฃo armazenados, C++ fornece o & operador (referรชncia). O operador retorna o endereรงo que uma variรกvel ocupa.
Por exemplo, se x for uma variรกvel, &x retornarรก o endereรงo da variรกvel.
Sintaxe de declaraรงรฃo de ponteiro
A declaraรงรฃo de C++ adota a seguinte sintaxe:
datatype *variable_name;
- O tipo de dados รฉ o tipo base do ponteiro que deve ser vรกlido C++ tipo de dados.
- O nome_variรกvel deve ser o nome da variรกvel ponteiro.
- O asterisco usado acima para declaraรงรฃo de ponteiro รฉ semelhante ao asterisco usado para realizar a operaรงรฃo de multiplicaรงรฃo. ร o asterisco que marca a variรกvel como um ponteiro.
Aqui estรก um exemplo de declaraรงรตes de ponteiro vรกlidas em C++:
int *x; // a pointer to integer double *x; // a pointer to double float *x; // a pointer to float char *ch // a pointer to a character
Operador de referรชncia (&) e operador de deferรชncia (*)
O operador de referรชncia (&) retorna o endereรงo da variรกvel.
O operador de desreferรชncia (*) nos ajuda a obter o valor que foi armazenado em um endereรงo de memรณria.
Por exemplo:
Se tivermos uma variรกvel com o nome num, armazenada no endereรงo 0x234 e armazenando o valor 28.
O operador de referรชncia (&) retornarรก 0x234.
O operador de desreferรชncia (*) retornarรก 5.
1 exemplo:
#include <iostream> using namespace std; int main() { int x = 27; int *ip; ip = &x; cout << "Value of x is : "; cout << x << endl; cout << "Value of ip is : "; cout << ip<< endl; cout << "Value of *ip is : "; cout << *ip << endl; return 0; }
Saรญda:
Como isso funciona:
Aqui estรก uma captura de tela do cรณdigo:
Code Explicaรงรฃo:
- Importe o arquivo de cabeรงalho iostream. Isso nos permitirรก usar as funรงรตes definidas no arquivo de cabeรงalho sem erros.
- Inclua o namespace std para usar suas classes sem chamรก-lo.
- Chame a funรงรฃo main(). A lรณgica do programa deve ser adicionada ao corpo desta funรงรฃo. O { marca o inรญcio do corpo da funรงรฃo.
- Declare uma variรกvel inteira x e atribua a ela o valor 27.
- Declare uma variรกvel de ponteiro *ip.
- Armazene o endereรงo da variรกvel x na variรกvel ponteiro.
- Imprima algum texto no console.
- Imprima o valor da variรกvel x na tela.
- Imprima algum texto no console.
- Imprima o endereรงo da variรกvel x. O valor do endereรงo foi armazenado na variรกvel ip.
- Imprima algum texto no console.
- Imprime o valor armazenado no endereรงo do ponteiro.
- O programa deve retornar um valor apรณs a execuรงรฃo bem-sucedida.
- Fim do corpo da funรงรฃo main().
Ponteiros e matrizes
Matrizes e ponteiros funcionam com base em um conceito relacionado. Hรก coisas diferentes a serem observadas ao trabalhar com arrays que possuem ponteiros. O prรณprio nome do array denota o endereรงo base do array. Isso significa que para atribuir o endereรงo de uma matriz a um ponteiro, vocรช nรฃo deve usar um e comercial (&).
Por exemplo:
p = arr;
O texto acima estรก correto, pois arr representa o endereรงo dos arrays. Aqui estรก outro exemplo:
p = &arr;
O acima estรก incorreto.
Podemos converter implicitamente um array em um ponteiro. Por exemplo:
int arr [20]; int * ip;
Abaixo estรก uma operaรงรฃo vรกlida:
ip = arr;
Apรณs a declaraรงรฃo acima, ip e arr serรฃo equivalentes e compartilharรฃo propriedades. No entanto, um endereรงo diferente pode ser atribuรญdo ao ip, mas nรฃo podemos atribuir nada ao arr.
2 exemplo:
Este exemplo mostra como percorrer um array usando ponteiros:
#include <iostream> using namespace std; int main() { int *ip; int arr[] = { 10, 34, 13, 76, 5, 46 }; ip = arr; for (int x = 0; x < 6; x++) { cout << *ip << endl; ip++; } return 0; }
Saรญda:
Aqui estรก uma captura de tela do cรณdigo:
Code Explicaรงรฃo:
- Declare uma variรกvel de ponteiro inteiro ip.
- Declare um array chamado arr e armazene 6 inteiros nele.
- Atribua arr ao ip. O ip e arr se tornarรฃo equivalentes.
- Crie um loop for. A variรกvel de loop x foi criada para iterar sobre os elementos do array do รญndice 0 a 5.
- Imprima os valores armazenados no endereรงo IP do ponteiro. Um valor serรก retornado por iteraรงรฃo e um total de 6 repetiรงรตes serรฃo feitas. O final รฉ um C++ palavra-chave que significa a linha final. Esta aรงรฃo permite mover o cursor para a prรณxima linha apรณs cada valor ser impresso. Cada valor serรก impresso em uma linha individual.
- Para mover o ponteiro para a prรณxima posiรงรฃo int apรณs cada iteraรงรฃo.
- Fim do loop for.
- O programa deve retornar algo apรณs a execuรงรฃo bem-sucedida.
- Fim do corpo da funรงรฃo main().
Ponteiro nulo
Se nรฃo houver um endereรงo exato a ser atribuรญdo, a variรกvel de ponteiro poderรก receber um NULL. Isso deve ser feito durante a declaraรงรฃo. Esse ponteiro รฉ conhecido como ponteiro nulo. Seu valor รฉ zero e รฉ definido em muitas bibliotecas padrรฃo como iostream.
3 exemplo:
#include <iostream> using namespace std; int main() { int *ip = NULL; cout << "Value of ip is: " << ip; return 0; }
Saรญda:
Aqui estรก uma captura de tela do cรณdigo:
Code Explicaรงรฃo:
- Declare uma variรกvel de ponteiro ip e atribua a ela um valor NULL.
- Imprime o valor da variรกvel de ponteiro ip ao lado de algum texto no console.
- O programa deve retornar o valor apรณs a conclusรฃo bem-sucedida.
- Fim do corpo da funรงรฃo main().
Ponteiros de Variรกveis
Com C++, vocรช pode manipular dados diretamente da memรณria do computador.
O espaรงo de memรณria pode ser atribuรญdo ou reatribuรญdo conforme desejado. Isso รฉ possรญvel graรงas ร s variรกveis โโโโde ponteiro.
Variรกveis โโde ponteiro apontam para um endereรงo especรญfico na memรณria do computador apontado por outra variรกvel.
Pode ser declarado da seguinte forma:
int *p;
Ou
int* p;
No seu exemplo, declaramos a variรกvel ponteiro p.
Ele conterรก um endereรงo de memรณria.
O asterisco รฉ o operador de desreferรชncia que significa um ponteiro para.
O ponteiro p estรก apontando para um valor inteiro no endereรงo de memรณria.
4 exemplo:
#include <iostream> using namespace std; int main() { int *p, x = 30; p = &x; cout << "Value of x is: " << *p; return 0; }
Saรญda:
Aqui estรก uma captura de tela do cรณdigo:
Code Explicaรงรฃo:
- Declare uma variรกvel de ponteiro p e uma variรกvel x com um valor de 30.
- Atribua o endereรงo da variรกvel x a p.
- Imprima o valor da variรกvel ponteiro p junto com algum texto no console.
- O programa deve retornar o valor apรณs a conclusรฃo bem-sucedida.
- Fim do corpo da funรงรฃo main().
Aplicaรงรฃo de Ponteiros
Funรงรตes em C++ pode retornar apenas um valor. Alรฉm disso, todas as variรกveis โโdeclaradas em uma funรงรฃo sรฃo alocadas na pilha de chamadas de funรงรฃo. Assim que a funรงรฃo retorna, todas as variรกveis โโda pilha sรฃo destruรญdas.
Os argumentos para a funรงรฃo sรฃo passados โโpor valor e qualquer modificaรงรฃo feita nas variรกveis โโnรฃo altera o valor das variรกveis โโreais que sรฃo passadas. O exemplo a seguir ajuda a ilustrar este conceito: -
5 exemplo:
#include <iostream> using namespace std; void test(int*, int*); int main() { int a = 5, b = 5; cout << "Before changing:" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; test(&a, &b); cout << "\nAfter changing" << endl; cout << "a = " << a << endl; cout << "b = " << b << endl; return 0; } void test(int* n1, int* n2) { *n1 = 10; *n2 = 11; }
Saรญda:
Aqui estรก uma captura de tela do cรณdigo:
Code Explicaรงรฃo:
- Crie um protรณtipo de uma funรงรฃo chamada test que receberรก dois parรขmetros inteiros.
- Chame a funรงรฃo main(). Adicionaremos a lรณgica do programa dentro de seu corpo.
- Declare duas variรกveis โโinteiras aeb, cada uma com valor 5.
- Imprima algum texto no console. O endl (linha final) moverรก o cursor para comeรงar a imprimir na prรณxima linha.
- Imprima o valor da variรกvel a no console junto com outro texto. O endl (linha final) moverรก o cursor para comeรงar a imprimir na prรณxima linha.
- Imprima o valor da variรกvel b no console junto com outro texto. O endl (linha final) moverรก o cursor para comeรงar a imprimir na prรณxima linha.
- Crie uma funรงรฃo chamada test() que receba os endereรงos das variรกveis โโโโa e b como parรขmetros.
- Imprima algum texto no console. O \n criarรก uma nova linha em branco antes do texto ser impresso. O endl (linha final) moverรก o cursor para comeรงar a imprimir na prรณxima linha apรณs a impressรฃo do texto.
- Imprima o valor da variรกvel a no console junto com outro texto. O endl (linha final) moverรก o cursor para comeรงar a imprimir na prรณxima linha.
- Imprima o valor da variรกvel b no console junto com outro texto. O endl (linha final) moverรก o cursor para comeรงar a imprimir na prรณxima linha.
- O programa deve retornar o valor apรณs a conclusรฃo bem-sucedida.
- Fim do corpo da funรงรฃo main().
- Definindo a funรงรฃo test(). A funรงรฃo deve receber duas variรกveis โโde ponteiro inteiro *n1 e *n2.
- Atribuindo ร variรกvel ponteiro *n1 um valor de 10.
- Atribuindo ร variรกvel ponteiro *n2 um valor de 11.
- Fim do corpo da funรงรฃo test().
Mesmo que novos valores sejam atribuรญdos ร s variรกveis โโa e b dentro do teste da funรงรฃo, uma vez concluรญda a chamada da funรงรฃo, o mesmo nรฃo รฉ refletido na funรงรฃo externa main.
Usar ponteiros como argumentos de funรงรฃo ajuda a passar o endereรงo real da variรกvel na funรงรฃo, e todas as alteraรงรตes realizadas na variรกvel serรฃo refletidas na funรงรฃo externa.
No caso acima, a funรงรฃo 'teste' possui o endereรงo das variรกveis โโ'a' e 'b'. Essas duas variรกveis โโsรฃo diretamente acessรญveis a partir da funรงรฃo 'test' e, portanto, qualquer alteraรงรฃo feita nessas variรกveis โโรฉ refletida na funรงรฃo chamadora 'main'.
Vantagens de usar ponteiros
Aqui estรฃo os prรณs/benefรญcios de usar ponteiros
- Ponteiros sรฃo variรกveis โโque armazenam o endereรงo de outros variรกveis โโem C++.
- Mais de uma variรกvel pode ser modificada e retornada por funรงรฃo usando ponteiros.
- A memรณria pode ser alocada e desalocada dinamicamente usando ponteiros.
- Os ponteiros ajudam a simplificar a complexidade do programa.
- A velocidade de execuรงรฃo de um programa melhora com o uso de ponteiros.







