Skip to content

Instantly share code, notes, and snippets.

@fernandosavio
Last active October 21, 2021 20:51
Show Gist options
  • Save fernandosavio/9f32c2a36b4d42db3c50 to your computer and use it in GitHub Desktop.
Save fernandosavio/9f32c2a36b4d42db3c50 to your computer and use it in GitHub Desktop.
Responde e explicando a prova do site http://www.cprogressivo.net/2013/03/Questoes-com-gabarito-sobre-Ponteiros-em-C.html (O que eu souber, é claro)

Link para a prova.

Questões:

Questão 1

Seja um vetor declarado por:

int vet[10];

Qual elemento deste vetor é acessado quando se escreve vet[2]?

  1. Primeiro elemento
  2. Segundo elemento
  3. Terceiro elemento
  4. Quarto elemento
  5. Nenhuma das opções anteriores

Motivo: a contagem de elementos começa no zero, então vet[2] é o 3º elemento, pois as
posições do vetor são: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


Questão 2

Se declararmos um vetor como:

int vet[30]

a instrução abaixo acessa corretamente os elementos deste vetor?

for (j=0; j <= 30; j++)
    vet[j] = j*j;
  1. Sim
  2. Não

Motivo: A variável j não foi declarada.


Questão 3

Seja a matriz matrx declarada e inicializada por:

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

O que conterá o elemento matrx[1][2] ?

  1. 2
  2. 5
  3. 6
  4. 7
  5. Nenhuma das opções anteriores

Motivo: Na declaração da matrix é especificado que os "subvetores" têm 4 elementos, então a declação:

{1,2,3,4,5,6,7,8,9,10,11,12}

Ficaria algo como:

{
   {1,2,3,4},
   {5,6,7,8},
   {9,10,11,12}
}

Por isso acessar matrx[1][2] corresponde ao valor 7.


Questão 4

Se uma string for declarada como:

char str[20];

o número máximo de caracteres que poderão ser lidos e armazenados nela é:

  1. 18
  2. 19
  3. 20
  4. 21

Motivo: o último caracter é sempre \0.


Questão 5

Qual função pode ser usada para determinar o comprimento de uma string?

  1. gets (Get String - Pega o input do usuário como string)
  2. strcpy (String Copy - Copia a string para outra variável)
  3. strcat (String Concatenate - Junta duas strings)
  4. strlen (String Length - Tamanho da string)
  5. strcmp (String Compare - Compara duas strings)

Questão 6

Qual das instruções abaixo é correta para declarar um ponteiro para inteiro?

  1. *int pti; (Nesse caso teria de ser int* pti;)
  2. *pti;
  3. &i;
  4. int_pti pti;
  5. int *pti;

Questão 7

Seja a seguinte seqüência de instruções em um programa C:

int *pti;
int i = 10;
pti = &i;

Qual afirmativa é falsa?

  1. pti armazena o endereço de i.

    (OK, ponteiros armazenam endereços, e nesse caos pti armazena o endereço de i)

  2. *pti é igual a �10.

    (OK, o * acessa o conteúdo do endereço apontado pelo ponteiro, como o ponteiro aponta para i então o conteúdo é 10)

  3. ao se executar *pti = 20; i passará a ter o valor 20.

    (Ok, ao dizer que o novo conteúdo de onde o ponteiro aponta é 20 então estará atribuindo 20 a i)

  4. ao se alterar o valor de i, *pti será modificado.

    (Correto, visto que i e *pti na prática são a mesma coisa )

  5. pti é igual a 10.

    (Errado, pti é igual ao endereço de i (&i) e não ao valor que o i carrega)


Questão 8

Se i e j são variáveis inteiras e pi e `pj são ponteiros para inteiro, qual atribuição é ilegal?

  1. pi = &i;

    (Correto, pois um ponteiro está recebendo um endereço de um inteiro)

  2. *pj = &j;

    (Errado, pois o conteúdo de pj é um inteiro e está recebendo um endereço)

  3. pj = &*&j;

    (Bizarro, mas legal. Um ponteiro pj está rebendo o endereço do conteúdo do endereço de j. Que no final das contas nada mais é do que o endereço do j)

  4. i = *&*&j; (Mesma bizarrice anterior)

  5. i = (*pi)+++*pj;

    ( Beleza, levando em conta que *pi equivale a i e *pj equivale a j então poderíamos traduzir isso para i = (i)+++j que equivaleria a isso i = (i) + (++j). Essa atribuição é legal, logo está certa. Leia sobre precedência de operadores e você vai ver que o ++ é sempre executado antes do + )


Questão 9

Seja a seguinte seqüência de instruções em um programa C:

int *pti;
int veti[]={10,7,2,6,3};
pti = veti;

Qual afirmativa é falsa?

  1. *pti é igual a 10 (Correto, veja a observação abaixo)
  2. *(pti+2) é igual a 2 (Correto, pois veti[0] == *pti então veti[2] == *(pti + 2) )
  3. pti[4] é igual a 3 (Correto, veja a observação abaixo)
  4. pti[1] é igual a 10 (Errada, pois pti[1] == 7 )
  5. *(veti+3) é igual a 6 (Correto, veja a observação abaixo)

Todo o vetor é um ponteiro que aponta para o primeiro elemento do vetor (a não ser que você mude isso :)


Questão 10

Na seqüência de instruções abaixo:

float f;
float *pf;
pf = &f;
scanf("%f", pf);
  1. Efetuamos a leitura de f. (Correta, pois efetuamos a leitura de pf que é um ponteiro para f . Como o próprio código já diz pf == &f)
  2. Não efetuamos a leitura de f
  3. Temos um erro de sintaxe
  4. Deveríamos estar usando &pf no scanf (&pf mostraria o endereço do endereço de f)
  5. Nenhuma das opções anteriores

Diquinha, se você ler as alternativa a e b vai ver que elas são opostas exatas. Sendo assim, obrigatoriamente uma delas é a correta, eliminando a possibilidade das 3 últimas. ;)


Questão 11

Seja a seguinte seqüência de instruções:

int i=10, j=20;
int *pti, *ptj;
pti = &i;
ptj = &j;

Qual expressão não é válida?

  1. j = pti == ptj;
  2. i = pti-ptj;
  3. pti += ptj; (Após teste vi que esse é o errado... Mas nem lembrava que essa operação era proibida entre ponteiros)
  4. pti++;
  5. i = pti || ptj;

Questão 12

Seja a declaração:

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

Qual afirmativa é falsa?

  1. **matr é igual a 1
  2. *(*(matr+1)+2) é igual a 7
  3. *(matr[2]+3) é igual a 12
  4. (*(matr+2))[2] é igual a 11
  5. *((*matr)+1) é igual a 5

Essa eu precisei testar para entender... Segue abaixo o código que usei para testar.

#include<stdlib.h>
#include<stdio.h>

int main(int argc, char const *argv[]) {

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


    printf("**matr == %d\n", **matr);                 // 1
    printf("*(*(matr+1)+2) == %d\n", *(*(matr+1)+2)); // 7
    printf("*(matr[2]+3) == %d\n", *(matr[2]+3));     // 12
    printf("(*(matr+2))[2] == %d\n", (*(matr+2))[2]); // 11
    printf("*((*matr)+1) == %d\n", *((*matr)+1));     // 2

    return 0;
}

As duas matrizes abaixo são equivalentes:

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

// Então:
*matr == matr[0] == {1,2,3,4};
**matr == matr[0][0] == 1;

Então:

  1. **matr é o mesmo que matr[0][0] pois um vetor é um ponteiro apontando para o primeiro elemento.
  2. *(*(matr+1)+2) => matr[0+1][0+2]) => matr[1][2] => 7
  3. *(matr[2]+3) => matr[2][3] => 12
  4. (*(matr+2))[2] => matr[2][2] => 11
  5. *((*matr)+1) => matr[0][1] => 2
@1asm1n
Copy link

1asm1n commented Aug 3, 2021

e ainda dizem que anjos não existem. valeu por salvar o bimestre em algoritmos : D

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment