Na Linguagem de programação C, uma matriz bidimensional é a...

Próximas questões
Com base no mesmo assunto
Q3953509 Programação
Na Linguagem de programação C, uma matriz bidimensional é armazenada de forma contígua na memória (em ordem de linha). Quando se utiliza aritmética de ponteiros para acessar um elemento específico matriz[i][j], é necessário realizar uma dupla desreferência: a primeira para localizar o início da linha desejada e a segunda para acessar o valor da coluna dentro dessa linha.
Considere uma matriz bidimensional declarada como float matriz[M][N];. De acordo com os padrões da linguagem C e as regras de precedência de operadores, assinale a alternativa que apresenta a expressão, em aritmética de ponteiros, que resulta corretamente no valor armazenado na linha i e na coluna j.
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Gabarito: D

Fundamento decisivo: A decisão dependia de identificar a única alternativa que reproduz a dupla desreferência equivalente a matriz[i][j] em float matriz[M][N].

Tema central: Aritmética de ponteiros
Análise das alternativas
A
Errada
Está errada porque faz apenas uma desreferência e soma j ainda no nível do ponteiro para linhas. Não equivale a *(*(matriz + i) + j), pois j não está sendo aplicado sobre ponteiro para float, e falta a desreferência final do elemento.
B
Errada
Está errada porque *(matriz + i) seleciona a linha i, mas a expressão termina com + j sem desreferenciar o elemento da coluna. Assim, não produz o valor armazenado em matriz[i][j].
C
Errada
Está errada porque apenas agrupa somas e continua com uma única desreferência sobre ponteiro para linha. Na prática, não há dupla desreferência nem seleção correta da coluna dentro da linha.
D
Certa
Para float matriz[M][N], a expressão matriz decai para ponteiro para a primeira linha, do tipo float (*)[N]. Então, matriz + i aponta para a linha i; ao desreferenciar, *(matriz + i) seleciona essa linha; em seguida, somar j localiza a coluna j dentro dessa linha; por fim, a desreferência externa retorna o valor armazenado nessa posição. Esse é exatamente o procedimento exigido para reproduzir matriz[i][j] por aritmética de ponteiros.
E
Errada
Está errada porque, embora a subexpressão (*(matriz + i))[j] corresponda ao valor de [i][j], a alternativa acrescenta '+ *', ficando sintaticamente inválida/incompleta. Como escrita, não é uma expressão C válida.
Pegadinha da questão
A confusão real era misturar ponteiro para linha com ponteiro para elemento e, por isso, achar que uma única desreferência ou que *(matriz + i) + j já entregaria o valor. Outra armadilha foi a alternativa E parecer correta pela subexpressão inicial, apesar de estar escrita de forma inválida.
Dica para questões semelhantes
  • Para matriz bidimensional em C, traduza primeiro o acesso por índices na forma padrão: matriz[i][j] = *(*(matriz + i) + j).
  • Separe os níveis: matriz + i localiza a linha; só depois de desreferenciar a linha é que j deve ser aplicado ao elemento.
  • Se a expressão ainda termina em ponteiro ou endereço, falta a desreferência final para obter o valor armazenado.

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

Matriz [M][N]

Matriz = vetor de M linhas

Matriz[i] = linha i

Matriz[i][j] = elemento j da linha i

Matriz[i] = *(matriz+i)

Matriz [i][j] = *(matriz+i)[j]

Matriz [i][j] = *(*(matriz+i)+j)

Clique para visualizar este comentário

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