Seja um vetor declarado por:
int vet[10];
Qual elemento deste vetor é acessado quando se escreve vet[2]
?
- Primeiro elemento
- Segundo elemento
- Terceiro elemento
- Quarto elemento
- 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]
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;
- Sim
- Não
Motivo: A variável
j
não foi declarada.
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]
?
- 2
- 5
- 6
- 7
- 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 valor7
.
Se uma string for declarada como:
char str[20];
o número máximo de caracteres que poderão ser lidos e armazenados nela é:
- 18
- 19
- 20
- 21
Motivo: o último caracter é sempre
\0
.
Qual função pode ser usada para determinar o comprimento de uma string?
- gets (Get String - Pega o input do usuário como string)
- strcpy (String Copy - Copia a string para outra variável)
- strcat (String Concatenate - Junta duas strings)
- strlen (String Length - Tamanho da string)
- strcmp (String Compare - Compara duas strings)
Qual das instruções abaixo é correta para declarar um ponteiro para inteiro?
*int pti;
(Nesse caso teria de serint* pti;
)*pti;
&i;
int_pti pti;
int *pti;
Seja a seguinte seqüência de instruções em um programa C:
int *pti;
int i = 10;
pti = &i;
Qual afirmativa é falsa?
-
pti
armazena o endereço dei
.(OK, ponteiros armazenam endereços, e nesse caos pti armazena o endereço de i)
-
*pti
é igual a �10
.(OK, o
*
acessa o conteúdo do endereço apontado pelo ponteiro, como o ponteiro aponta parai
então o conteúdo é10
) -
ao se executar
*pti = 20;
i
passará a ter o valor20
.(Ok, ao dizer que o novo conteúdo de onde o ponteiro aponta é
20
então estará atribuindo20
ai
) -
ao se alterar o valor de
i
,*pti
será modificado.(Correto, visto que
i
e*pti
na prática são a mesma coisa ) -
pti
é igual a 10.(Errado,
pti
é igual ao endereço de i (&i
) e não ao valor que oi
carrega)
Se i
e j
são variáveis inteiras e pi
e `pj são ponteiros para inteiro, qual atribuição é ilegal?
-
pi = &i;
(Correto, pois um ponteiro está recebendo um endereço de um inteiro)
-
*pj = &j;
(Errado, pois o conteúdo de
pj
é um inteiro e está recebendo um endereço) -
pj = &*&j;
(Bizarro, mas legal. Um ponteiro
pj
está rebendo o endereço do conteúdo do endereço dej
. Que no final das contas nada mais é do que o endereço doj
) -
i = *&*&j;
(Mesma bizarrice anterior) -
i = (*pi)+++*pj;
( Beleza, levando em conta que
*pi
equivale ai
e*pj
equivale aj
então poderíamos traduzir isso parai = (i)+++j
que equivaleria a issoi = (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+
)
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?
*pti
é igual a10
(Correto, veja a observação abaixo)*(pti+2) é igual a 2
(Correto, poisveti[0] == *pti
entãoveti[2] == *(pti + 2)
)pti[4]
é igual a3
(Correto, veja a observação abaixo)pti[1]
é igual a10
(Errada, poispti[1] == 7
)*(veti+3)
é igual a6
(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 :)
Na seqüência de instruções abaixo:
float f;
float *pf;
pf = &f;
scanf("%f", pf);
- Efetuamos a leitura de f. (Correta, pois efetuamos a leitura de
pf
que é um ponteiro paraf
. Como o próprio código já dizpf == &f
) - Não efetuamos a leitura de f
- Temos um erro de sintaxe
- Deveríamos estar usando &pf no scanf (
&pf
mostraria o endereço do endereço def
) - Nenhuma das opções anteriores
Diquinha, se você ler as alternativa
a
eb
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?
j = pti == ptj;
i = pti-ptj;
pti += ptj;
(Após teste vi que esse é o errado... Mas nem lembrava que essa operação era proibida entre ponteiros)pti++;
i = pti || ptj;
Seja a declaração:
int matr[][4] = {1,2,3,4,5,6,7,8,9,10,11,12}
Qual afirmativa é falsa?
**matr
é igual a1
*(*(matr+1)+2)
é igual a7
*(matr[2]+3)
é igual a12
(*(matr+2))[2]
é igual a11
*((*matr)+1)
é igual a5
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:
**matr
é o mesmo quematr[0][0]
pois um vetor é um ponteiro apontando para o primeiro elemento.*(*(matr+1)+2)
=>matr[0+1][0+2])
=>matr[1][2]
=>7
*(matr[2]+3)
=>matr[2][3]
=>12
(*(matr+2))[2]
=>matr[2][2]
=>11
*((*matr)+1)
=>matr[0][1]
=>2
e ainda dizem que anjos não existem. valeu por salvar o bimestre em algoritmos : D