int vetor [5] = 0, 1, 2, 3, 4;
int matriz [4][4] = 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4;
char string [10] = "BICAMPEAO";
a) declarar variáveis a, b, c, d do tipo int.
b) declarar variáveis e, f, g, h do tipo float.
c) declarar vetor v de 10 elementos do tipo char.
d) declarar variável x do tipo int.
e) criar um ponteiro apontando para o endereço de a.
f) incrementar o ponteiro, mostrando o conteúdo do endereço apontado (em forma de número). Caso o endereço coincida com o endereço de alguma outra variável, informar o fato.
a) p = &i;
b) *q = &j;
c) p = &*&i;
d) i = (*&)j;
e) i = *&j;
f) i = *&*&j;
g) q = *p;
h) i = (*p)++ + *q
#include <stdio.h> int main() { int x, *p, **q; p = &x; q = &p; x = 10; printf("\n%d\n", &q); return(0); }
# include <stdio.h> int main(void) { int i=5, *p; p= &i; printf("%u %d %d %d %d \n", p, *p+2, **&p, 3**p, **&p+4); return 0; }
int i=3, j=5; int *p, *q; p= &i; q= &j;
Qual é o valor das expressões?
a) p==&i
b) *p-*q
c) **&p
d) 3*-*p/(*q)+7
a) *(pulo + 3)
b) *(pulo + 2)
c) *(pulo + 4)
d) pulo + 3
e) pulo + 2
#include <stdio.h> int main(void) { static int mat[]={4, 5, 6}; int i; for (i=0; i<3; i++) printf("%d ", *(mat + i)); return 0; }
#include <stdio.h> int main(void) { static int mat[]={4, 5, 6}; int i, *ptr; ptr = mat; for (i=0; i<3; i++) printf("%d ", *ptr++); return 0; }
int main() { int y, *p, x; y = 0; p = &y; x = *p; x = 4; (*p)++; x--; (*p) += x; printf ("y = %d\n", y); return(0); }
#include <stdio.h> int main() { int x, *p, **q; p = &x; q = &p; x = 10; printf("\n%d\n", &q); return(0); }
int main () { float matrx [50][50]; int i,j; for (i=0;i<50;i++) for (j=0;j<50;j++) matrx[i][j]=0.0; return(0); }
int vetor[10]; int *ponteiro;
a) vetor = vetor + 2;
b) vetor++;
c) vetor = ponteiro;
d) ponteiro = vetor;
e) ponteiro = vetor+2;
int i; int v[10]; int* p;
Quais dos seguintes comandos estão corretos, quais dão erros de compilação, e quais dão erros de execução? Suponha que os comandos são executados na ordem dada, e que os comandos que dão erro não afetam os demais comandos.
#include <stdio.h> int main() { int y, *p, x; y = 0; p = &y; x = *p; x = 10; (*p)++; x--; printf("%d\n", *p); (*p) += x; printf ("%d\n", y); printf("%d\n", &x==p); return(0); }
#include<stdio.h> int main(){ int x = 320; char *ptr; ptr = (char *) &x; printf("%d ",*ptr); return 0; }
a) 2.
b) 320.
c) 64.
d) Erro na compilação.
e) NDA (nenhuma das alternativas).
Solução: para resolver essa questão, deve-se lembrar que o tipo int é representado por dois bytes, enquanto o tipo char é representado por apenas um byte.
O valor binário de 320 é 00000001 01000000 (lembrando que seria usado 16 bits). Porém, o ponteiro ptr está apontando para os primeiros 8 bits da variável x, ou seja, o valor 01000000. Isso acontece porque o ponteiro ptr é do tipo char. Esse valor corresponde ao valor 64 em decimal.
Para confirmar essa equivalência de valores em sistemas numéricos diferentes, basta utilizar uma calculadora científica do seu sistema operacional. Ou, se achar melhor, construir um programa em C para constatar essa equivalência.
#include <stdio.h> int main(){ int i = 3; int *j; int **k; j=&i; k=&j; printf("%u %u %d ", k, *k, **k); return 0; }
a) endereço, endereço, 3.
b) endereço, 3, 3.
c) 3, 3, 3.
d) Erro na compilação.
e) NDA (nenhuma das anteriores).
int *p; p = rand();
#include <stdio.h> int main (void) { int *p, A[] = {10, 20, 30}; p = A; printf("%p\n", A); printf("%d - %p\n", *p+1, p); printf("%d - %p\n", *p++, p); printf("%d - %p\n", *(p++), p); printf("%d - %p\n", (*p)++, p); return 0; }
#include <stdio.h> #include <stdlib.h> int main() { int valor = 10, *ponteiro; void *ptr; ptr = &valor; ponteiro = ptr; printf("%d", *ponteiro); // printf("%d", *ptr); return 0; }
Se o código for compilado e executado, irá aparecer na tela o valor 10. Porém, se a linha printf("%d", *ptr); for descomentada, irá aparecer a mensagem de erro abaixo. Explique o que estaria errado neste programa (na hipótese de tirar o comentário).
gcc -lm -Wall -o "teste1" "teste1.c" (no diretório: /home/tiago)
Compilação falhou.
teste.c: In function ‘main’:
teste.c:10: warning: dereferencing ‘void *’ pointer
teste.c:10: error: invalid use of void expression
Resposta: o erro irá aparecer na linha 10, que é exatamente a linha que antes estava comentada (e por isso mesmo é que funcionava). O erro acontece porque o ponteiro ptr é genérico e pode apontar para endereços de qualquer tipo. Por isso que a atribuição ptr = &valor está correta. Porém, este ponteiro (ptr) precisa ser convertido para um tipo específico no momento de ser desreferenciado. O desreferenciamento acontece quando se pega o valor (conteúdo) do ponteiro a partir do endereço para o qual está apontando.
#include <stdio.h> #include <stdlib.h> int main() { int a = 10; float b = 2.3; void *ptr; ptr = &a; printf("%d\n", *(int *)ptr); ptr = &b; printf("%.1f\n", *(float *)ptr); return 0; }
Há necessidade de se fazer a conversão explícita (cast) do ponteiro ptr ou seria possível imprimir diretamente através dos comandos abaixo?
printf("%d", *ptr);
printf("%.1f", *ptr);
SOLUçãO: VMSEPARAPARESIMPARES.C
#include <stdio.h> int main() { int x, *px; px = &x; scanf("%d", *px); printf("%d", x); return 0; }
#include <stdio.h> int main () { int i, *pi; *pi = 10; return 0; }
Dado o seguinte trecho de programa escrito na Linguagem C.
int x, y, *p, **p; x = 20; y = 15; p = &x; pp = &p; *p = 30; **pp = 40;
Considerando que x foi alocado num endereço composto pelos 3 primeiros dígitos de sua matrícula (já com os dois primeiros dígitos desprezados), e que y foi alocado nos próximos três, responda o que será impresso em cada alternativa, após a execução do trecho de programa acima:
a) *p
b) **pp
c) p
d) pp
e) &x
f) &y
*p = | p | *p | p = p + 10 | *p = *p + 10 |