C++ Ponteiros com exemplos

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 (*)

Explicação do código:

  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

Explicação do código:

  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

Explicação do código:

  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

Explicação do código:

  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

Explicação do código:

  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.

Resumo

  • Um ponteiro se refere a uma variável que contém o endereço de outra variável.
  • Cada ponteiro possui um tipo de dados válido.
  • Um ponteiro é uma representação simbólica de um endereço de memória.
  • Os ponteiros permitem que os programas simulem chamadas por referência e criem e manipulem estruturas de dados dinâmicas.
  • Arrays e os ponteiros usam um conceito relacionado.
  • O nome do array denota a base do array.
  • Se você deseja atribuir o endereço de uma matriz a um ponteiro, não use um E comercial (&).
  • Se não houver um endereço específico para atribuir uma variável de ponteiro, atribua-lhe um NULL.