Resolução da questão 11 de 2008

Obs: O espaço que dei entre os grupos de colchetes (“[ ] [ ]”) não deve existir. Fi-lo apenas porque o segundo grupo de colchetes sempre estava sendo exibido na linha de baixo aqui no post quando eu nao dava o espaço entre eles. Portanto, fiquem atentos a isso.

Eis a questão:

11. Considere a seguinte declaração em linguagem C:

 

int a[ ] [3] = {1,2,3,4,5,6,7,8,9,10,11,12};

 

A instrução printf ( “%d”, *(a[1]+2)) irá retornar o valor:

(A) 2

(B) 3

(C) 5

(D) 6

(E) 10

 

Esse é o tipo de questão que refina nossos conhecimentos ao extremo e é por isso que as provas antigas da EsFCEx, em minha humilde opinião, eram extremamente difíceis. Essa questão exige muito conhecimento sobre vetores e ponteiros em C. Se você não domina esses assuntos, de uma olhadinha no livro “Estrutura de Dados usando C”. Ele pode auxiliar muito.

Vou tentar explicar como resolvê-la.

Quando declaramos o vetor int a[ ] [3] = {1,2,3,4,5,6,7,8,9,10,11,12};

estamos dizendo que teremos um vetor bidimensional (linhas x colunas) de 3 colunas. Só temos definida a quantidade de colunas, pois a mesma é representada pelo segundo grupo de colchetes “[3]”.

Não sabemos quantas linhas esse vetor tem, pois os colchetes que representam as linhas está em branco “[ ]”. O compilador então vai determinar isso na inicialização do vetor.

Então entendo que ele vai dividir tudo isso entre as chaves “{1,2,3,4,5,6,7,8,9,10,11,12}” em grupos de 3 colunas, para determinar as linhas, assim teremos 4 linhas.

Em tese, essa inicialização seria a mesma coisa que declarar:

int a[4] [3] = {1,2,3,4,5,6,7,8,9,10,11,12};

ou

int a[4] [3] = {(1,2,3),(4,5,6),(7,8,9),(10,11,12)};

Beleza até aqui… bom, vamos ao comando print da questão:

printf (“%d”, *(a[1] + 2));

 

Esse “*” serve pra identificar o valor que há dentro de um campo sendo apontado.

Segundo os materiais que consultei, temos as seguintes deduções:

*(a) = a[ ] = a[0]

*(a + 1) = a[1]

*(a + 2) = a[2]

*(a + 3) = a[3]

darei um exemplo:

considere o vetor vet[4] = {200, 10, 5, 1500};

Assim:

vet[0] = 200

vet[1] = 10

vet[2] = 5

vet[3] = 1500

Até ai é beleza, o problema vem na interpretação abaixo.

De acordo com a notação de ponteiros temos que:

 

vet[0]  = *(vet) = *(vet + 0) = 200

vet[1]  = *(vet + 1) = 10

vet[2]  = *(vet + 2) = 5

vet[3]  = *(vet + 3) = 1500

 

Esse raciocínio é para um vetor unidimensional. Porém temos nessa questão um vetor bidimensional.

No caso do exercício da prova, cada linha tem 3 colunas certo?

Independente de o vetor ser uni, bi, tri ou multidimensional, ele sempre vai ser organizado sequencialmente na memória.

Se considerarmos uma organização sequencial desses números teríamos que na posição:

Explicação

0 temos o número 1, na 1 temos o número 2, na 2 temos o número 3 <fim da primeira linha>

3 temos o número 4, na 4 temos o número 5, na 5 temos o número 6 <fim da segunda linha>

e o raciocínio continua até o fim de quarta linha.

Então, se estamos tratando de um vetor bidimensional, quando dizemos a[1] estamos dizendo que na notação de ponteiros temos:

* (  * (a + 1) + 0 ) que quer dizer * (  * (a + <numero da linha>) + <numero da coluna> ) isso porque agora estamos lidando com 2 dimensões no vetor.

Se fossemos traduzir de um modo grosseiro isso tudo, já que todo o vetor, independente de uni ou multidimensional é organizado sequencialmente, poderíamos dizer que:

a[1] ou *(a + 1) é a posição 3 do vetor (ver explicação). Mas ainda não estamos considerando o número das colunas. Se quiséssemos acessar o segundo elemento da segunda linha teríamos que somar mais duas posições à posição 3. Assim teríamos a posição 5, que é igual a 6

Quando você diz para o compilador, num vetor bidimensional, vá para a[0], ele irá para a posição 0… vá para a[1], ele irá para a posição 3… quando disser vá para a[2], ele irá para a posição 6, vá para a[3], ele irá para a posição 9…  colocando agora as colunas em jogo também, temos que quando dissermos vá para a[0] [0], ele irá para a posição 0… vá para a[0] [1], ele irá para a posição 1… a[0] [2], ele irá para a posição 2…
a[1] [0], ele irá para a posição 3… a[1] [1], ele irá para a posição 4…   a[1] [2], ele irá para a posição 5…  etc etc etc

tudo isso para te explicar aquilo que escrevi acima, que:

* (  * (a + <numero da linha>) + <numero da coluna> )

é o modo de se caminhar no vetor através de ponteiros, em vetores bidimensionais.

Ou seja:

a[0] [0] = * (  * (a + 0 ) + 0 )

a[2] [1] = * (  * (a + 2 ) + 1 )

a[1] [0] = * (  * (a + 1 ) + 0 )

etc…

é confuso pra caramba… pelo menos eu acho… mas espero que tenham entendido… porque eu demorei quase 1 dia pra entender, rs

Vamos à questão:

printf (“%d”, *(a[1] + 2));

a[1] = *(a + 1) então temos printf (“%d”, *(*(a + 1) + 2)); Exatamente o método de ir para linha e coluna em vetores bidimensionais através do valor dentro dos ponteiros.

*(a + 1) = linha 1 = 4,5,6 (se déssemos um printf nisso iríamos obter apenas o número 4)

*(*(a + 1) + 2) =  linha 1 coluna 2

 

col 0         col 1      col2

linha 0         ——>                     1             2             3

linha 1         ——>                     4             5             6

linha 2         ——>                     7             8            9

linha 3         ——>                     10           11         12

 

Resposta D = 6

 

 

Abraços

3 opiniões sobre “Resolução da questão 11 de 2008”

    Apenas colaboradores que estejam logados podem acessar os comentários!