Ponteiros C ++ com exemplos

Índice:

Anonim

O que são ponteiros?

Em C ++, um ponteiro se refere a uma variável que contém o endereço de outra variável. Como as variáveis ​​regulares, os ponteiros têm 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 de tipo de caractere pode conter o endereço de uma variável de tipo de caractere.

Você deve 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 se refere a uma variável que aponta para um endereço específico em uma memória apontada por outra variável.

Neste tutorial C ++, você aprenderá:

  • O que são ponteiros?
  • Endereços em C ++
  • Sintaxe de declaração de ponteiro
  • Operador de referência (&) e operador de deferência (*)
  • Ponteiros e matrizes
  • Ponteiro nulo
  • Ponteiros de variáveis
  • Aplicação de Ponteiros
  • Vantagens de usar ponteiros

Endereços em C ++

Para entender os ponteiros C ++, você deve entender como os computadores armazenam dados.

Quando você cria uma variável em seu programa C ++, é atribuído a ela algum espaço na memória do computador. O valor desta variável é armazenado no local atribuído.

Para saber a localização na memória do computador onde os dados são armazenados, C ++ fornece o operador & (referência). O operador retorna o endereço que ocupa uma variável.

Por exemplo, se x for uma variável, & x retorna o endereço da variável.

Sintaxe de declaração de ponteiro

A declaração de C ++ assume a seguinte sintaxe:

datatype *variable_name;
  • O tipo de dados é o tipo base do ponteiro, que deve ser um tipo de dados C ++ válido.
  • O variable_name deve ser o nome da variável de ponteiro.
  • O asterisco usado acima para a declaração do 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 integerdouble *x; // a pointer to doublefloat *x; // a pointer to floatchar *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.

Exemplo 1:

#include 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;}

Resultado:

Como funciona:

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

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 obter 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 um valor de 27.
  5. Declare uma variável de ponteiro * ip.
  6. Armazene o endereço da variável x na variável de 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 o 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 matrizes que possuem ponteiros. O próprio nome da matriz denota o endereço básico da matriz. 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 acima está correto, pois arr representa o endereço das matrizes. 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 a ip, mas não podemos atribuir nada a arr.

Exemplo 2:

Este exemplo mostra como percorrer uma matriz usando ponteiros:

#include 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;}

Resultado:

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

Explicação do código:

  1. Declare uma variável de ponteiro de inteiro ip.
  2. Declare uma matriz chamada arr e armazene 6 inteiros nela.
  3. Atribuir arr para 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 da matriz do índice 0 a 5.
  5. Imprime os valores armazenados no endereço do IP do ponteiro. Um valor será retornado por iteração, e um total de 6 repetições serão feitas. O endl é uma palavra-chave C ++ 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 interna 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 pode receber um NULL. 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.

Exemplo 3:

#include using namespace std;int main() {int *ip = NULL;cout << "Value of ip is: " << ip;return 0;}

Resultado:

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

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 um 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 como desejar. Isso é possível por meio de variáveis ​​Pointer.

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 exemplo você, declaramos a variável de ponteiro p.

Ele manterá 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 da memória.

Exemplo 4:

#include using namespace std;int main() {int *p, x = 30;p = &x;cout << "Value of x is: " << *p;return 0;}

Resultado:

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

Explicação do código:

  1. Declare uma variável de ponteiro pe uma variável x com um valor de 30.
  2. Atribua o endereço da variável xa p.
  3. Imprima o valor da variável de ponteiro p ao lado de algum texto no console.
  4. O programa deve retornar um valor após a conclusão bem-sucedida.
  5. Fim do corpo da função main ().

Aplicação de Ponteiros

As funções em C ++ podem 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: -

Exemplo 5:

#include 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;}

Resultado:

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

Explicação do código:

  1. Crie um protótipo de uma função chamada test que terá dois parâmetros inteiros.
  2. Chame a função main (). Vamos adicionar a lógica do programa dentro de seu corpo.
  3. Declare duas variáveis ​​inteiras a e b, cada uma com o 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 leva os endereços das variáveis ​​aeb como parâmetros.
  8. Imprima algum texto no console. O \ n criará uma nova linha em branco antes de o 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 um valor após a conclusão bem-sucedida.
  12. Fim do corpo da função main ().
  13. Definindo o teste de função (). A função deve levar duas variáveis ​​de ponteiro inteiro * n1 e * n2.
  14. Atribuindo à variável de ponteiro * n1 um valor de 10.
  15. Atribuindo à variável de ponteiro * n2 um valor de 11.
  16. Fim do corpo do teste de função ().

Mesmo assim, novos valores são atribuídos às variáveis ​​aeb dentro do teste de função, uma vez que a chamada de função é concluída, o mesmo não é refletido na função externa principal.

Usar ponteiros como argumentos de função ajuda a passar o endereço real da variável na função, e todas as mudanças realizadas na variável serão refletidas na função externa.

No caso acima, a função 'teste' tem o endereço das variáveis ​​'a' e 'b.' Essas duas variáveis ​​são diretamente acessíveis a partir da função 'teste' e, portanto, qualquer alteração feita nessas variáveis ​​é refletida na função do chamador 'principal'.

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 outras variáveis ​​em C ++.
  • Mais de uma variável pode ser modificada e retornada pela função usando ponteiros.
  • A memória pode ser alocada dinamicamente e desalocada 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 chamada por referência e criem e manipulem estruturas de dados dinâmicas.
  • Matrizes e ponteiros usam um conceito relacionado.
  • O nome da matriz denota a base da matriz.
  • Se você quiser 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 a ela um NULL.