Ponteiros e referências são os recursos mais poderosos em C e C ++, que permitem aos programadores manipular diretamente o endereço da memória para um gerenciamento eficiente da memória.
Ambas são variáveis usadas para se referir a outros objetos indiretamente e compartilham alguns recursos comuns na superfície. Embora eles compartilhem muitas capacidades comuns, eles também são muito complexos para entender.
Um ponteiro é uma variável que contém o endereço de memória de outra variável, enquanto uma referência é como um ponteiro que pode ser usado para se referir indiretamente a outra variável.
A maioria dos programadores parece desenvolver algum entendimento sobre quando usar ponteiros e quando usar referências, mas geralmente se deparam com problemas cuja solução parece incerta..
Então, para entender melhor a filosofia, vamos entender a diferença entre os dois.
Toda variável é um local de memória definido pelo seu endereço e emparelhado com um identificador que contém algum valor que pode ser alterado durante o curso de um programa. Em termos simples, variável é um símbolo que representa uma quantidade.
Um ponteiro é uma variável que contém o endereço de memória de outra variável. Um ponteiro não é senão um endereço e uma variável que armazena um ponteiro é chamada de variável de ponteiro.
A idéia é usar identificadores (ou nomes) em vez de endereços numéricos para aliviar o fardo da programação, reduzindo assim a complexidade dos programas. Como esses endereços se referem a locais reais na memória do computador, ponteiros podem ser usados para acessar e manipular o conteúdo armazenado na memória.
Como qualquer variável ou constante, os ponteiros devem ser declarados para seus tipos. Como os ponteiros contêm endereços de memória que pertencem a um tipo de dados separado, eles devem ser declarados usando ponteiros para que você possa trabalhar com eles. A forma geral de uma declaração de ponteiro é:
Data_type * var-name;
Aqui, “Data_type” é o tipo base do ponteiro e “var-name” é a variável do ponteiro. O asterisco (*) aqui é usado para declarar o ponteiro que designa a variável "var-name" como uma variável de ponteiro.
int * p; // ponteiro inteiro
float * x; // ponteiro flutuante
Aqui, a variável "p" aponta para um tipo de dados inteiro que é declarado como "int", que se refere ao tipo de dados da variável. Da mesma forma, no segundo exemplo, "float" refere-se ao tipo de dados da variável "x" que de fato é designada como um ponteiro para uma variável de ponto flutuante.
Uma referência é como um ponteiro com acesso indireto a uma variável. É como um alias para outra variável, o que significa que é apenas outro nome para uma variável já existente.
Ele permite que os programadores criem um segundo nome para a variável que eles podem usar para manipular o conteúdo armazenado nessa variável. É uma entidade que é um alias para outra variável e tem o mesmo endereço da variável original. Ele suporta passagem por referência, atuando como parâmetros formais de função e, uma vez definido para se referir a uma variável, não pode ser redimensionado, o que significa que não pode ser referido a outra variável.
Ao contrário dos ponteiros, eles não precisam do operador de desreferenciamento para acessar o valor; de fato, eles podem ser usados como variáveis normais.
int i;
int & ri = i;
Aqui, "ri" é uma referência inteira inicializada para "i". Ele declara "ri" como um objeto do tipo "referência a int". Uma referência pode ser facilmente confundida com um ponteiro que é uma variável independente, cujos valores de endereço não podem ser reatribuídos depois de criados.
- Ambos oferecem recursos quase semelhantes em termos de usabilidade e a distinção pode ser complicada. Um ponteiro é apenas uma variável que armazena o endereço de memória de outra variável, enquanto uma referência é como um alias para uma variável já existente. Ele cria um segundo nome para uma variável que pode ser usada para modificar o conteúdo armazenado nessa variável.
- Um ponteiro é como qualquer outra variável que armazena um dado. Diferentemente de outras variáveis, as variáveis de ponteiro armazenam endereços de memória em vez de valores. Um ponteiro é desreferenciado usando o operador indireto * para acessar o local da memória da variável para a qual aponta. Uma referência, por outro lado, não precisa de nenhum operador de desreferenciamento para acessar o valor.
- Ao contrário dos ponteiros que podem ser inicializados a qualquer momento, as referências devem ser atribuídas na inicialização. Os ponteiros podem ser acessados diretamente, enquanto as referências não podem ser acessadas diretamente.
- Uma variável de ponteiro possui seu próprio local na memória, o que significa que quando você declara um ponteiro, especifica um local que é um endereço de memória atribuído a cada unidade de memória. A variável ponteiro tem o mesmo endereço em que é salva na memória. Uma variável de referência, por outro lado, é um alias para outra variável, assumindo assim o endereço da variável de referência.
- NULL representa o final da lista, o que significa que indica que o valor é desconhecido e especifica que a variável não possui um espaço de endereço válido. O valor NULL pode ser atribuído diretamente a uma variável de ponteiro, o que sugere que não aponte para lugar nenhum, enquanto NULL não pode ser atribuído a uma variável de referência.
Os ponteiros sempre estiveram entre os tópicos favoritos da discussão dos programadores de C / C ++ até as referências aparecerem. As referências são um pouco semelhantes aos indicadores, mas têm seu quinhão de prós e contras em comparação. Embora ambos possam ser usados para alterar variáveis locais de uma função dentro de outra, eles têm suas diferenças. Ambos são recursos poderosos em C e C ++ que permitem manipular diretamente a memória, mas com algumas exceções. Um ponteiro mantém o endereço de memória de uma variável, enquanto uma referência é apenas um alias para outra variável.