Contextualizando
Desde o nosso curso de Algoritmos e Lógica de Programação, vimos que variáveis são estruturas para o armazenamento temporário de dados na memória de um dispositivo. Nas disciplinas de Arquitetura de Computadores, que por enquanto não faz parte do escopo desse site, os estudantes de Sistemas Embarcados aprendem que existem diferentes tipos de memória.
É importante que o estudante aprenda desde cedo que para um bom desempenho de um sistema é fundamental fazer o devido gerenciamento dessa memória para que não seja sobrecarregada e diferentemente de um PC, o hardware utilizado em sistemas embarcados é geralmente modesto desse recursos.
Por ser um assunto complexo, para facilitar o entendimento dividiremos o material em diferentes postagens e hoje trataremos do básico.
Variáveis e seus endereços de memória
Toda vez que você declara uma variável seja em C ou C++, o seu programa manda o sistema operacional reservar um espaço na memória para o armazenamento daquela informação. Mesmo que aquela variável sofra alterações, o endereço permanece o mesmo.
Na maioria das vezes o desenvolvedor não está muito preocupado com o que está por baixo desse processo, mas saiba que em C/C++ você pode até descobrir o endereço da memória onde uma variável foi criada. Isso pode ser feito através do operador & antecedendo o nome da variável. Veja o exemplo:
- #include <iostream>
- using namespace std;
- int main() {
- int numero = 0;
- while (numero<10){
- cout << "Numero: "<<numero << " ";
- cout << "Endereço: "<<&numero << "\n";
- numero++;
- }
- return 0;
- }
Nesse exemplo criamos uma variável inteira chamada numero que será mostrada na tela, juntamente com o seu endereço de memória (linha 8). A variável sofrerá um incremento (linha 9) e isso se repetirá por mais nove vezes.
Repare que o endereço de memória da variável permanece o mesmo enquanto o programa é executado, sendo que em uma nova execução o endereço se altera em relação a execução anterior, mas permanece também o mesmo ao longo da segunda execução.
Usando mais espaço de memória
É comum o desenvolvedor por diversas razões querer criar novas variáveis para armazenar o valor de uma variável já existente ou resultado de algum processamento dessa variável. Nessa hora o programa vai solicitar ao sistema a reserva de outro endereço de memória e isso acaba usando mais espaço de memória. Veja o exemplo:
- #include <iostream>
- using namespace std;
- int main() {
- int numero = 10;
- int resultado=numero;
- cout << "Valor numero : "<<numero << "\n";
- cout << "Valor resultado: "<<resultado<< "\n";
- cout << "Endereço numero : "<<&numero << "\n";
- cout << "Endereço resultado: "<<&resultado << "\n";
- return 0;
- }
Veja que na linha 6 estamos criando a variável resultado como sendo igual a variável número, por isso o valor que ambas armazenam é o mesmo. No entanto é usado um outro endereço de memória para armazenar a segunda variável.
Outro detalhe é que, se numero sofrer uma alteração, o valor de resultado não refletirá essa alteração do numero. Isso pode ou não ser conveniente para um programa. Exemplo:
- #include <iostream>
- using namespace std;
- int main() {
- int numero = 1;
- int resultado=numero;
- while (numero<5){
- cout << "Valor numero : "<<numero << " ";
- cout << "Endereço numero : "<<&numero << "\n";
- cout << "Valor resultado: "<<resultado<< " ";
- cout << "Endereço resultado: "<<&resultado << "\n";
- numero++;
- }
- return 0;
- }
Repare que o valor de numero se altera com o incremento, mas o valor de resultado permanece imutável.
Criando variáveis por referência
Uma alternativa para essa questão é criar a segunda variável por referencia, isto é, utilizando o mesmo endereço de memória da primeira variável. Nessa hora não estamos passando o valor da variável. Estamos informando ao sistema para pegar o que está armazenado em um endereço. Para isso devemos incluir o operador & antes do nome da segunda variável. Veja o exemplo:
- #include <iostream>
- using namespace std;
- int main() {
- int numero = 1;
- int &resultado=numero;
- while (numero<5){
- cout << "Valor numero : "<<numero << " ";
- cout << "Endereço numero : "<<&numero << "\n";
- cout << "Valor resultado: "<<resultado<< " ";
- cout << "Endereço resultado: "<<&resultado << "\n";
- numero++;
- }
- return 0;
- }
Nesse caso o endereço de memória de ambas é o mesmo, e o valor da segunda variável sofrerá a mesma alteração da primeira.
Usando Variáveis Ponteiros
A Variável Ponteiro é muito parecida uma variável criada por referência porque, ambas apontam para o endereço de memória de outra variável. No entanto os ponteiros permitem a manipulação desse endereço em operações a nível de hardware enquanto as referências trabalham em um nível mais elevado, preocupando-se basicamente com o valor da variável.
Para criar um ponteiro usa-se o operador * antes do nome do ponteiro e posteriormente passa-se a referencia do endereço de memória de uma variável como já conhecemos. Veja o exemplo:
- #include <iostream>
- using namespace std;
- int main() {
- int numero = 1;
- int &resultado=numero;
- int *ponteiro=№
- while (numero<5){
- cout << "Valor numero : "<<numero << " ";
- cout << "Endereço numero : "<<&numero << "\n";
- cout << "Valor resultado: "<<resultado<< " ";
- cout << "Endereço resultado: "<<&resultado << "\n";
- cout << "Valor ponteiro : "<<resultado<< " ";
- cout << "Endereço ponteiro : "<<&resultado << "\n";
- numero++;
- }
- return 0;
- }
Seguindo a linha do exemplo anterior, veja que as alterações na primeira variável também se refletem na variável ponteiro. Vale ressaltar que ponteiros é um recurso também disponível na linguagem C.
Referências
DEITEL, H. M. DEITEL, P. J. C++: Como programar. Pearson Education do Brasil. 2006.
GBDONLINE. Learn C++ Programming. Disponível em: <https://learn.onlinegdb.com/c%2B%2B_for_beginners> Acesso em 05 ago. 2024.
W3SCHOOLS. C++ Tutorial. Disponível em: <https://www.w3schools.com/cpp/default.asp> Acesso em 05 ago. 2024.