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
jnã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?
-
ptiarmazena 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 paraientão o conteúdo é10) -
ao se executar
*pti = 20;ipassará a ter o valor20.(Ok, ao dizer que o novo conteúdo de onde o ponteiro aponta é
20então estará atribuindo20ai) -
ao se alterar o valor de
i,*ptiserá modificado.(Correto, visto que
ie*ptina 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 oicarrega)
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
pjestá 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
*piequivale aie*pjequivale ajentão poderíamos traduzir isso parai = (i)+++jque 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] == *ptientã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
pfque é 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 (
&pfmostraria o endereço do endereço def) - Nenhuma das opções anteriores
Diquinha, se você ler as alternativa
aebvai 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