A manipulação de ponteiros, apesar de extremamente útil para diversas situações, requer um cuidado especial para que não sejam acessadas posições indevidas de memória. Para essa questão, suponha o seguinte código:
#include
int main()
{
int a, b, *p;
b = 0;
p = &b;
a = *p;
a = 10;
(*p)++;
--a;
(*p) += a;
printf("a = %d\tb = %d\tp = %d",a,b,*p);
return 0;
}
Assinale a alternativa que contém os valores de “ a ”, “ b ” e do conteúdo de “ p ”, respectivamente.
( ) 9, 10, 10.
( ) 10, 10, 10.
( ) 10, 9, 10.
( ) 9, 9, 10.
( ) 9, 9, 9.
Soluções para a tarefa
Resposta:
a = 9, b = 10, *p = 10, isso porque *p recebe o mesmo endereço de memória de b, então, qualquer alteração que a gente fizer na variável b, automaticamente altera a variável p, compreende? Pois ambas possuem endereços iguais, isso acontece vice versa, se alterarmos a variável p, acabamos alterando também a variável b, pois o código diz que *p = &b, ou seja, esse "&" é o identificador de endereço de memória, logo ambas acabam tendo o mesmo endereço.
Explicação:
#include <stdio.h>
int main()
{
int a, b, *p;
b = 0;
p = &b; // -> o ponteiro "p", recebe o endereço de b, ou seja, qualquer valor que b receber, p também receberá, pois ambas possuem agora o mesmo endereço.
a = *p; // -> a variável "a" está recebendo o valor de p, como p = b e vice versa e b = 0, então acaba ficando a = 0.
a = 10; // -> a variável "a" recebe o valor 10, então o valor 0 que ela tinha não existe mais, agora a = 10.
(*p)++; // -> a variável(ponteiro) está sendo incrementado em 1, esse "++" é a mesma coisa de *p = *p + 1. Se antes o valor de *p = 0 e foi incrementado 1, então *p = 1.
--a; //-> O valor de "a" é 10, mas está sendo decrementado 1 (--a), então, a = 9.
(*p) += a; //-> como *p = 1, ele está recebendo sendo somado com "a", (*p = *p + a), ou seja, se a = 9 e *p = 1, então *p + a = 10. Como *p tem o mesmo endereço de memória da variável b, então b acaba se tornando 10 também.
printf("a = %d\tb = %d\tp = %d",a,b,*p); //-> portanto, a = 9, b = 10 e *p = 10.
return 0;
}