Na linguagem C++, considere: I. O endereço armazenado em um ...

Próximas questões
Com base no mesmo assunto
Ano: 2010 Banca: FCC Órgão: TRE-AM Prova: FCC - 2010 - TRE-AM - Programador de computador |
Q34992 Programação
Na linguagem C++, considere:

I. O endereço armazenado em um ponteiro deve ser do mesmo tipo que o ponteiro (ex. um ponteiro para um int não pode armazenar o endereço de um float).

II. Exceção à regra apontada em (I) é o ponteiro void.

III. Não é possível chamar uma função segundo seu endereço, ainda que por meio de um ponteiro que armazena o endereço de início dessa função.

Está correto o que se afirma em
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

A alternativa correta é a letra C - I e II, apenas.

Vamos entender o porquê dessa resposta ser a correta:

  • Item I: Em C++, o tipo de um ponteiro deve corresponder ao tipo de dado ao qual ele aponta. Isso significa que se você tem um ponteiro do tipo int, ele deve apontar para um endereço de memória onde há um valor do tipo int. Por isso, essa afirmação é verdadeira e importante para evitar erros de tipo em tempo de compilação e problemas de interpretação dos dados em tempo de execução.
  • Item II: O ponteiro void é uma exceção à regra mencionada acima. Ele é um tipo especial de ponteiro que pode apontar para qualquer tipo de dado, funcionando como um ponteiro genérico. No entanto, não se pode realizar operações de desreferenciamento diretamente em um ponteiro void sem antes convertê-lo (cast) para o tipo apropriado. Essa característica torna o ponteiro void bastante útil em certas situações, como em funções de alocação de memória genéricas. Portanto, essa afirmação também é verdadeira.
  • Item III: Esta afirmação é falsa. Em C++, é totalmente possível chamar uma função através de seu endereço usando um ponteiro de função. Ponteiros de função armazenam o endereço de memória de funções e podem ser usados para chamar essas funções indiretamente. Esta é uma técnica que pode ser útil em várias situações, incluindo quando queremos passar funções como argumentos para outras funções ou quando precisamos de flexibilidade na execução de chamadas de função.

Portanto, as afirmações I e II estão corretas e nos ajudam a entender o funcionamento e as regras associadas ao uso de ponteiros em C++, que são fundamentais para a programação de baixo nível e o gerenciamento de memória. O conhecimento sobre ponteiros é essencial para quem deseja desenvolver software eficiente e compreender melhor como o computador opera internamente.

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo

Comentários

Veja os comentários dos nossos alunos

Questão confusa. Eu anularia, já que o julgamento da questão não pode ser objetivo, já que a alternativa (I) é incorreta, mas supõe-se que seja correta desde que a (II) funcione em conjunto com a mesma.
A I e II estão corretas. 
Segue sobre ponteiros void (Tradução Chula)

"Void Pointers (Ponteiros Vazios)

Chamamos de ponteiros vazios qualquer ponteiro que não possua um tipo de dado específico, ou seja, se seu tipo de dado for void.

Ponteiros vazios ou void pointers são ponteiros genéricos que podem apontar para qualquer outro tipo de dado... "

http://www.tiexpert.net/programacao/c/null-pointer-void-pointer.php

Mas, Douglas BN,

I) Definiu a regra sem falar da exceção, isso não a torna errada, está apenas incompleta.

II) Traz a segunda parte da regra, sua exceção.

III) Em C++ não existem ponteiros para funções, como no Delphi por exemplo.

Dicas Pertinentes:

1 - Note que as alterativas utilizam a palavra "apenas", se marcar a) fica errado como você falou, pois a informação estaria incompleta, sendo assim, errada. Marcar b) corrige o problema do qual você reclama.

2 - Se existem duas afirmações corretas, marque a "MAIS CERTA", pois marcar a "menos certa" é o mesmo que dizer que a "MAIS CERTA" está errada.

A questão I é FALSA, porque podemos fazer um cast para alterar o tipo de um ponteiro. Confira o exemplo:

int *p;

float c;

p = (int *)&c;

A questão II deveria ser FALSA, porque apesar de um ponteiro void poder receber um endereço para qualquer tipo sem cast, a regra em (I) também pode ser quebrada usando-se um cast, portanto não é a única exceção à regra (I).

A questão III, também é FALSA. Ponteiros para funções podem ser usados em C++ (e em C) também. Confira o seguinte exemplo:

#include <iostream>

int myfunc(int i) { return i + 1; }

int main(int argc, char const *argv[]) {

int (*p)(int);

p = &myfunc;

int k = p(2);

std::cout << k << std::endl;

return 0;

}

Apenas não é muito comum, porque o suporte à classes e métodos em C++ torna desnecessário o uso. Mas, por razões de compatibilidade com C, a funcionalidade foi incluída em C++.

A questão deveria ser anulada.

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo