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?
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?
Toda variável que é criada é armazenada num endereço de memória do computador. Portanto, cada variável possui 3 propriedades básicas:
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:
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.
Obs.: caso tenha ficado alguma dúvida, queira mais exemplos de uso dos operadores & e , pode falar.