Pular para o conteúdo principal

Questão de Programação — Programação estruturada — FUNDATEC 2026

ProgramaçãoProgramação estruturada
Código
qg685275
Banca
FUNDATEC
Órgão
IFC-SC
Ano
2026
Nível
Superior
Cargo
Professor EBTT - Informática: Linguagens de Programação
Analise o seguinte programa escrito em linguagem C conforme o padrão ANSI C, no qual arrays multidimensionais são armazenados em memória de forma contígua em ordem de linhas (row-major order):Imagem associada para resolução da questãoQual valor será impresso pelo programa?
  1. A4
  2. B5
  3. C6
  4. D7
  5. E8
Revelar gabarito e comentário

GabaritoC — 6

Esta resolução diverge do gabarito oficial. A banca deu Letra C; a resolução abaixo sustenta o contrário e explica por quê — ela não foi reescrita para concordar. Acontece nos dois sentidos: há gabarito que cai em recurso e há resolução que erra. Confira na fonte antes de fixar o entendimento.
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”.

Resolução

Gabarito: letra C — a conta chega a O programa imprime 6 — alternativa C.

A ideia por trás

Em C, um array multidimensional é guardado na memória de forma contígua, linha por linha: primeiro todos os elementos da linha 0, depois todos os da linha 1. Isso é a ordem row-major. O nome do array, quando usado numa expressão, vira um ponteiro para o primeiro elemento — no caso de uma matriz 2x3, um ponteiro para a primeira linha (um array de 3 inteiros).

A aritmética de ponteiros anda de acordo com o tipo apontado: se o ponteiro é para int, somar 1 avança um inteiro (4 bytes); se é para um array de 3 ints, somar 1 avança 3 inteiros (12 bytes). Por isso, a mesma expressão *(p+1) pode dar resultados diferentes dependendo do tipo de p. A condição de validade é que o ponteiro aponte para uma região válida da memória.

A questão mistura esses dois conceitos: o array é bidimensional, mas o ponteiro p foi declarado como int *. O que importa é o tipo do ponteiro, não o formato do array. Precisamos ver como p foi declarado e o que p+1 realmente significa.

O que a questão dá

  • array bidimensional: int matriz[2][3] = 1, 2, 3}, {4, 5, 6

  • declaração: int *p = matriz;

  • expressão impressa: *(p + 1)

O que queremos: o valor que o programa imprime

Passo 1 — Ver o tipo do ponteiro p

A aritmética de ponteiros depende do tipo apontado. Aqui p foi declarado como int *, ou seja, ponteiro para inteiro. Isso define quanto p+1 anda na memória.

peˊint\boxed{\text{p} é \text{int} *}
NÃO CAIA NESSA!

Achar que p é ponteiro para linha, mas a declaração é int p, não int (p)[3].

Passo 2 — Descobrir para onde p aponta

O nome do array matriz decai para um ponteiro para o primeiro elemento. Como matriz é int[2][3], o primeiro elemento é a linha 0, que é um array de 3 ints. Mas p é int *, então a atribuição int *p = matriz; faz p apontar para o primeiro inteiro dessa linha, ou seja, matriz[0][0].

p aponta para matriz[0][0], que vale 1

NÃO CAIA NESSA!

Pensar que p aponta para a linha inteira; na verdade aponta para o primeiro elemento da linha.

Passo 3 — Calcular o que p + 1 significa

Como p é int *, somar 1 avança sizeof(int) bytes, ou seja, um inteiro. Então p+1 aponta para o próximo inteiro na memória, que é matriz[0][1].

Por que esta fórmula: A aritmética de ponteiros é escalada pelo tamanho do tipo apontado: p+1 = endereço de p + 1*sizeof(int).

p+1enderec¸o de p+1×sizeof(int)p + 1 \rightarrow \text{endereço de } p + 1 \times \text{sizeof(int)}

De onde vem cada valor: pp = passo 2: aponta para matriz[0][0] · sizeof(int)sizeof(int) = definição: tamanho do tipo int em C, tipicamente 4 bytes, mas o que importa é que avança um inteiro

p+1 aponta para matriz[0][1]

NÃO CAIA NESSA!

Achar que p+1 avança uma linha inteira (3 inteiros) — isso só aconteceria se p fosse int (*)[3].

Passo 4 — Desreferenciar e obter o valor

O operador * acessa o valor apontado pelo ponteiro. Como p+1 aponta para matriz[0][1], *(p+1) é o valor armazenado ali.

6\boxed{6}
NÃO CAIA NESSA!

Confundir com o valor 4, que seria o primeiro elemento da segunda linha, mas p+1 não chega lá.

Resposta: O programa imprime 6 — alternativa C

Link permanente: /questoes/qg685275