Na linguagem C++, considere: I. O endereço armazenado em um ...
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
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 tipoint
. 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 ponteirovoid
sem antes convertê-lo (cast) para o tipo apropriado. Essa característica torna o ponteirovoid
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
"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.phpMas, 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