Ed. Técnica, perguntado por luizzz07, 1 ano atrás

Na programação em linguagem C, é muito importante que o desenvolvedor tenha atenção quando utilizar ponteiro para acessar a memória, pois esse ponto é a fonte de muitos erros de projeto. No entanto, a maioria não são erros de compilação, mas que aparecem durante a execução do sistema, quando áreas impróprias da memória são invadidas e escritas de maneira indevida e não premeditada. Isso pode se mostrar perigoso, principalmente em situações de controle crítico, como um aparelho hospitalar, por exemplo. Por isso, é importante também saber como os ponteiros se comportam e como podem ser usados pelo programador para trazer seus devidos benefícios, apenas.

Observe o programa na imagem seguinte, escrito para ser compilado, transferido e executado pelo ATmega328. Podemos observar que o programa não possui um propósito de aplicação, é apenas demonstrativo. Considerando que os valores que aparecem na memória de dados se referem ao instante em que a execução do programa atinge o fim da última instrução da função 1, qual das alternativas pode ser considerada falsa?

.................IMAGEM EM ANEXO....................

Escolha uma:

a. Apesar do programa não ter nenhum objetivo de controle, e de algumas variáveis se mostrarem desnecessárias, pois apenas recebem um valor para em seguida repassa-lo adiante sem nenhuma alteração, o programa se mostra isente de qualquer incoerência de sintaxe; e os valores na memória estão corretos, de acordo com o esperado.

b. A atribuição da variável Var1 para o ponteiro PontMain não está com a sintaxe correta, pois são tipos diferentes. A primeira é do tipo unsigned int e a segunda é do tipo ponteiro para unsigned int. Pelo contexto, o esperado era o comando PontMain = &Var1;, e em seguida Funcao1(PontMain);, para justificar a existência do ponteiro.

c. Quando a função Funcao1 é invocada, o argumento/parâmetro de entrada usado é um unsigned int, apesar do seu tipo esperado ser um ponteiro para unsigned int. No entanto, na forma em que está escrito, não há nada de errado, uma vez que o valor transferido é o endereço da variável, e não seu conteúdo, o que é compatível. Basicamente, Funcao1(&Var1); gera o mesmo resultado que PontMain = &Var1; Funcao1(PontMain);. (((((Incorreto)))))))

d. Na forma com que aparece não irá ter problema ao compilar (em parte dos compiladores), pois o compilador realizará um typecasting, ou conversão de tipos, automaticamente, e o valor a ser transferido para o ponteiro não será o endereço de Var1, mas seu conteúdo, diferente do que aparece na memória para o PontMain.
e. O último comando da função auxiliar é basicamente o inverso do comando anterior (Var2 = Var1;), pois o comando *PontDatF1 = Var2; pode ser substituído pelo comando Var1 = Var2;, que o efeito será o mesmo. Isso ocorre devido ao ponteiro local PontDatF1 receber o valor &Var1 (variável global) quando a função foi invocada, ou seja, apontar para esta variável a partir disso.

Anexos:

Soluções para a tarefa

Respondido por henrymordenti20
69
resposta a. Apesar do programa não ter nenhum objetivo de controle, e de algumas variáveis se mostrarem desnecessárias, pois apenas recebem um valor para em seguida repassa-lo adiante sem nenhuma alteração, o programa se mostra isente de qualquer incoerência de sintaxe; e os valores na memória estão corretos, de acordo com o esperado
Perguntas interessantes