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 é: Um ponteiro armazena o endereço de memória de outra variável.
  • 🔧 Declaração: Declare um ponteiro com um asterisco, como int *ptr;.
  • 🔗 Operatores: Use & para obter um endereço e * para acessar o valor nele.
  • 🚫 NULO: Um ponteiro nulo não aponta para nada e é usado para inicialização segura.
  • 🤖 Ajuda da IA: Ferramentas de IA como o GitHub Copilot escrevem e depuram código de ponteiro instantaneamente.

C++ Ponteiros

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:

Operador de referência (&) e operador de deferência (*)

Como isso funciona:

Operador de referência (&) e operador de deferência (*)

Aqui está uma captura de tela do código:

Operador de referência (&) e operador de deferência (*)

Code Explicação:

  1. Importe o arquivo de cabeçalho iostream. Isso nos permitirá usar as funções definidas no arquivo de cabeçalho sem erros.
  2. Inclua o namespace std para usar suas classes sem chamá-lo.
  3. 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.
  4. Declare uma variável inteira x e atribua a ela o valor 27.
  5. Declare uma variável de ponteiro *ip.
  6. Armazene o endereço da variável x na variável ponteiro.
  7. Imprima algum texto no console.
  8. Imprima o valor da variável x na tela.
  9. Imprima algum texto no console.
  10. Imprima o endereço da variável x. O valor do endereço foi armazenado na variável ip.
  11. Imprima algum texto no console.
  12. Imprime o valor armazenado no endereço do ponteiro.
  13. O programa deve retornar um valor após a execução bem-sucedida.
  14. 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:

Ponteiros e matrizes

Aqui está uma captura de tela do código:

Ponteiros e matrizes

Code Explicação:

  1. Declare uma variável de ponteiro inteiro ip.
  2. Declare um array chamado arr e armazene 6 inteiros nele.
  3. Atribua arr ao ip. O ip e arr se tornarão equivalentes.
  4. Crie um loop for. A variável de loop x foi criada para iterar sobre os elementos do array do índice 0 a 5.
  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.
  6. Para mover o ponteiro para a próxima posição int após cada iteração.
  7. Fim do loop for.
  8. O programa deve retornar algo após a execução bem-sucedida.
  9. 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:

Ponteiro nulo

Aqui está uma captura de tela do código:

Ponteiro nulo

Code Explicação:

  1. Declare uma variável de ponteiro ip e atribua a ela um valor NULL.
  2. Imprime o valor da variável de ponteiro ip ao lado de algum texto no console.
  3. O programa deve retornar o valor após a conclusão bem-sucedida.
  4. 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:

Ponteiros de Variáveis

Aqui está uma captura de tela do código:

Ponteiros de Variáveis

Code Explicação:

  1. Declare uma variável de ponteiro p e uma variável x com um valor de 30.
  2. Atribua o endereço da variável x a p.
  3. Imprima o valor da variável ponteiro p junto com algum texto no console.
  4. O programa deve retornar o valor após a conclusão bem-sucedida.
  5. 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:

Aplicação de Ponteiros

Aqui está uma captura de tela do código:

Aplicação de Ponteiros

Code Explicação:

  1. Crie um protótipo de uma função chamada test que receberá dois parâmetros inteiros.
  2. Chame a função main(). Adicionaremos a lógica do programa dentro de seu corpo.
  3. Declare duas variáveis ​​inteiras aeb, cada uma com valor 5.
  4. Imprima algum texto no console. O endl (linha final) moverá o cursor para começar a imprimir na próxima linha.
  5. 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.
  6. 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.
  7. Crie uma função chamada test() que receba os endereços das variáveis ​​​​a e b como parâmetros.
  8. 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.
  9. 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.
  10. 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.
  11. O programa deve retornar o valor após a conclusão bem-sucedida.
  12. Fim do corpo da função main().
  13. Definindo a função test(). A função deve receber duas variáveis ​​de ponteiro inteiro *n1 e *n2.
  14. Atribuindo à variável ponteiro *n1 um valor de 10.
  15. Atribuindo à variável ponteiro *n2 um valor de 11.
  16. 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.

Perguntas Frequentes

Um ponteiro é uma variável que armazena o endereço de memória de outra variável. Em vez de armazenar um valor diretamente, ele armazena a localização onde o valor está guardado na memória.

Declare um ponteiro colocando um asterisco entre o tipo de dado e o nome, como em `int *ptr;`. Isso cria um ponteiro que pode armazenar o endereço de um inteiro.

O operador de referência & retorna o endereço de memória de uma variável, e o operador de desreferência * acessa o valor armazenado no endereço que um ponteiro ocupa.

Um ponteiro NULL é um ponteiro que não aponta para nenhum local de memória válido. Ele recebe o valor NULL para indicar que está vazio e para evitar o uso de um endereço não inicializado.

O nome de um array funciona como um ponteiro para o seu primeiro elemento, permitindo que você use aritmética de ponteiros para percorrer os elementos do array em vez de usar números de índice.

Assistentes de IA como o GitHub Copilot geram declarações de ponteiros, realizam aritmética de ponteiros e sinalizam o uso de ponteiros pendentes ou nulos que podem causar falhas no seu programa.

Sim. Ferramentas com inteligência artificial detectam vazamentos de memória, ponteiros pendentes e desreferências nulas, e sugerem ponteiros inteligentes como `unique_ptr` para um gerenciamento de memória mais seguro.

Os ponteiros permitem acesso direto à memória, manipulação eficiente de arrays e strings, alocação dinâmica de memória e passagem de grandes volumes de dados para funções sem a necessidade de copiá-los.

Resuma esta postagem com: