Pular para o conteúdo principal

Questão de Programação — Conceitos básicos de programação — FUNDATEC 2025

ProgramaçãoConceitos básicos de programação
Código
qg473694
Banca
FUNDATEC
Órgão
IF Sul - MG
Ano
2025
Nível
Superior
Cargo
PEBTT - Informática

Para responder a questão, considere o programa a seguir, feito em linguagem C. As linhas estão numeradas apenas para referência.


Imagem da questão

Na linha 11, o asterisco (*) que precede o msg serve para indicar que o parâmetro:
  1. ANão armazena um caractere simples, mas um ponteiro que aponta para o endereço do primeiro caractere da string.
  2. BÉ um objeto do tipo string, onde cada caractere é armazenado com o seu valor ASCII, uma vez que o C não trata caracteres de forma direta.
  3. CArmazena qualquer tipo de dado, uma vez que o símbolo * representa a entrada de qualquer tipo de valor na variável, definindo o seu tipo dinamicamente de acordo com o valor.
  4. DÉ um parâmetro que pode ser omitido na chamada da função, assumindo, por padrão, o caractere asterisco (*).
  5. EFaz consistência do valor inserido no parâmetro considerando o caractere (*) no caso de o valor inserido não ser um caractere.
Revelar gabarito e comentário

GabaritoA — Não armazena um caractere simples, mas um ponteiro que aponta para o endereço do primeiro caractere da string.

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Ponteiros em C: o asterisco na declaração de parâmetros

Gabarito: letra A. Na linguagem C, o asterisco (*) na declaração de um parâmetro indica que ele é um ponteiro — ou seja, uma variável que armazena o endereço de memória de outra variável. No caso de char *msg, o parâmetro msg é um ponteiro para o primeiro caractere de uma string (um array de caracteres terminado em \0). As demais alternativas confundem o operador de ponteiro com conceitos de outras linguagens ou com funcionalidades inexistentes em C.

O conceito central aqui é o de ponteiro, uma das bases da linguagem C. Um ponteiro é uma variável cujo valor é um endereço de memória. Quando declaramos char *msg, estamos dizendo: "msg é uma variável que guarda o endereço de um caractere". Como strings em C são, na prática, arrays de caracteres terminados pelo caractere nulo (\0), o endereço do primeiro caractere é o ponto de partida para acessar toda a string. Por isso, ao passar uma string para uma função, o que se passa é o endereço do seu primeiro elemento — e é exatamente isso que o asterisco na assinatura da função comunica.

A distinção que importa é entre passagem por valor e passagem por referência (que em C é simulada com ponteiros). Quando passamos um inteiro comum, a função recebe uma cópia do valor; alterações dentro da função não afetam a variável original. Quando passamos um ponteiro, a função recebe o endereço da variável original; alterações no conteúdo apontado afetam a variável original. No caso de strings, passar o ponteiro para o primeiro caractere permite que a função leia e até modifique o conteúdo da string original, sem copiar o array inteiro — uma economia de memória e uma forma de compartilhar dados.

A pegadinha que a banca explora é a confusão entre o operador * (que declara um ponteiro ou desreferencia um ponteiro) e o operador * da multiplicação. Na declaração char *msg, o asterisco não multiplica nada: ele é um modificador de tipo que diz "isto é um ponteiro para". Além disso, a banca tenta atrair o candidato com conceitos de linguagens de mais alto nível (como string em Java ou Python, ou tipagem dinâmica em JavaScript), que não existem em C. Em C, não há um tipo string nativo; há apenas arrays de char e ponteiros para char.

Guarde a fronteira: em C, * na declaração = ponteiro (endereço); * na expressão = desreferência (acesso ao valor apontado); * entre dois operandos = multiplicação. É exatamente nessa distinção que as alternativas se dividem.

1Na declaração
Ponteiro (endereço de memória)
Ex.: char *msg → endereço do 1º caractere
2Na expressão
Desreferência (acesso ao valor apontado)
3Entre operandos
Multiplicação
Asterisco (*) em C
LEVELsoulevel.com.br
Asterisco (*) em C: Na declaração (Ponteiro (endereço de memória), Ex.: char *msg → endereço do 1º caractere); Na expressão (Desreferência (acesso ao valor apontado)); Entre operandos (Multiplicação)

Alternativa A — ✅ Correta ⟵ GABARITO

Esta alternativa descreve com precisão o que o asterisco faz na linha 11: char *msg declara msg como um ponteiro para char, ou seja, uma variável que armazena o endereço de memória do primeiro caractere da string. Como strings em C são sequências de caracteres terminadas por \0, o endereço do primeiro caractere é suficiente para acessar toda a string. É exatamente o mecanismo de passagem de strings para funções em C.

Alternativa B — ❌ Incorreta

Afirma que o parâmetro é um "objeto do tipo string" e que "o C não trata caracteres de forma direta". Em C, não existe um tipo string nativo — strings são representadas como arrays de char (ou ponteiros para char). Além disso, o C trata caracteres de forma direta: o tipo char é um tipo primitivo que armazena um caractere (na prática, um valor numérico ASCII). O erro está em importar o conceito de "objeto string" de linguagens como Java ou Python, que não se aplica a C.

Alternativa C — ❌ Incorreta

Afirma que o asterisco "representa a entrada de qualquer tipo de valor" e que o tipo é definido "dinamicamente". Isso descreve a tipagem dinâmica de linguagens como Python ou JavaScript, mas C é uma linguagem de tipagem estática e forte: o tipo de cada variável é fixado na declaração e não muda durante a execução. O * não é um coringa de tipo; ele é o operador de ponteiro, que exige que o tipo do dado apontado seja especificado (no caso, char).

Alternativa D — ❌ Incorreta

Afirma que o parâmetro "pode ser omitido na chamada da função, assumindo, por padrão, o caractere asterisco (*)". Isso é completamente sem sentido em C. Parâmetros de função em C não têm valores padrão (diferente de C++ ou Python). Se a função é declarada com um parâmetro, a chamada deve fornecer um argumento para ele. O asterisco na declaração não é um valor padrão; é um modificador de tipo que indica ponteiro.

Alternativa E — ❌ Incorreta

Afirma que o asterisco "faz consistência do valor inserido no parâmetro considerando o caractere () no caso de o valor inserido não ser um caractere". Não existe nenhum mecanismo de "consistência" ou validação automática associado ao operador `` em C. O asterisco simplesmente declara um ponteiro; a validação de tipos é feita pelo compilador em tempo de compilação, não em tempo de execução por um operador. A alternativa inventa uma funcionalidade que não existe na linguagem.

Gabarito: letra A — o asterisco na declaração char *msg indica que o parâmetro é um ponteiro para o primeiro caractere da string.

Link permanente: /questoes/qg473694