Questão de Programação — Programação estruturada — FUNDATEC 2026
- Código
- qg685275
- Banca
- FUNDATEC
- Órgão
- IFC-SC
- Ano
- 2026
- Nível
- Superior
- Cargo
- Professor EBTT - Informática: Linguagens de Programação
Qual valor será impresso pelo programa?- A4
- B5
- C6
- D7
- E8
Qual valor será impresso pelo programa?GabaritoC — 6
Gabarito: letra C — a conta chega a O programa imprime 6 — alternativa C.
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.
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
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.
Achar que p é ponteiro para linha, mas a declaração é int p, não int (p)[3].
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
Pensar que p aponta para a linha inteira; na verdade aponta para o primeiro elemento da linha.
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).
De onde vem cada valor: = passo 2: aponta para matriz[0][0] · = 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]
Achar que p+1 avança uma linha inteira (3 inteiros) — isso só aconteceria se p fosse int (*)[3].
O operador * acessa o valor apontado pelo ponteiro. Como p+1 aponta para matriz[0][1], *(p+1) é o valor armazenado ali.
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