1
resposta

Pergunta simples

Eu ja to estudando C faz algum tempo mas sempre acabo me confundindo com os ponteiros em onde/quando usar & e onde usar *. Alguém poderia tentar elaborar uma explicação com uma didática que uma criança de 5 anos entenderia?

1 resposta

Toda variável que é criada é armazenada num endereço de memória do computador. Portanto, cada variável possui 3 propriedades básicas:

  • Nome da variável
  • Valor da variável
  • Posição de memória da variável

Diagrama de propriedade das variáveis

Normalmente, nós utilizamos somente o nome das variáveis para poder referenciar seu valor, mas existem algumas situações em que precisamos saber seu endereço de memória para podermos realizar algumas operações.

Existem duas formas de se utilizar a posição/endereço de memória de uma variável, acessando seu valor quando for necessário ou armazenando este valor numa variável especial chamada ponteiro.

Para acessar o endereço de memória de uma variável é utilizado o operador &. Abaixo nós temos alguns exemplos de sua utilização:

int num;

// scanf(<string_de_leitura>, <endereço_das_variaveis>);
scanf("%d", &num);

// %x exibe um valor hexadecimal, que é o formato de um endereço de memória
printf("Endereco de num: %x\n", &num); // Endereco de num: c230d

E para criar um ponteiro é utilizado o símbolo *. Vale ressaltar que este símbolo pode assumir três funções diferentes dentro de um código:

  • Operador de multiplicação entre dois números
  • Símbolo para declaração/criação de ponteiros
  • Operador de acesso à memória, para retornar o conteúdo de uma posição de memória
int num = 42, c = 2;
printf("Multiplicacao entre num e c: %d\n", num * c); // Multiplicacao entre num e c: 84

int *endereco_de_num = &num, *endereco_de_c = &c; // * indica que a variável declarada é um ponteiro, seu valor é retornado pelo operador &
printf("Endereco de num: %x\n", &num); // Endereco de num: c230d
printf("Endereco de num: %x\n", endereco_de_num); // Endereco de num: c230d

int copia_de_num = *endereco_de_num; // 42
// como * está no lado direito da igualdade, ele é um operador de acesso à memória. Portanto, ele está acessando o valor armazenado no endereço de num (c230d) e atribuindo à variável copia_de_num

printf("Valor de num: %d, Valor de copia_de_num: %d\n": num, copia_de_num); // Valor de num: 42, Valor de copia_de_num: 42
printf("Endereco de num: %x, Endereco de copia_de_num: %x\n": &num, &copia_de_num); // Endereco de num: c230d, Endereco de copia_de_num: 42ca50
// Perceba que mesmo que as variáveis tenham o mesmo valor, por serem diferentes elas estão armazenadas em endereços diferentes

Segue abaixo um diagrama de armazenamento das variáveis do código acima.

Alocação de memória das variáveis

Obs.: caso tenha ficado alguma dúvida, queira mais exemplos de uso dos operadores & e , pode falar.