Exercícios sobre Ponteiros
Estes exercícios caíram em provas:
1) a) Qual o valor de y no final do programa?
b) Escreva um /* comentário */ em cada comando de atribuição explicando o que ele faz e o valor da variável à esquerda do '=' após sua execução.
c) Explique o porquê de a atribuição *q = 10 causar problemas.
#include <stdio.h>
int main()
{
int x, y, *p, *q; // 2 variáveis inteiras e 2 ponteiros
y = 19; // y recebe 19
p = &y; // p recebe o endereço de y
x = *p; // x recebe o conteúdo apontado por p (=19)
x = 7; // x recebe 7 (mas y continua com 19)
(*p)++; // incremento o conteúdo apontado por p (y++) ---> y = 20
x--; // decremento de x ---> x = 6
(*p) = (*p) + x; // o mesmo que y = y + x ---> y = 26
printf ("y = %d\n", y); // y = 26
*q = 10; // q não foi inicializada; não sabemos seu conteúdo, ou seja, para que endereço vai apontar; o problema ocorre porque tento escrever num endereço que não pertence à área do usuário.
return 0;
}
int main()
{
int x, y, *p, *q; // 2 variáveis inteiras e 2 ponteiros
y = 19; // y recebe 19
p = &y; // p recebe o endereço de y
x = *p; // x recebe o conteúdo apontado por p (=19)
x = 7; // x recebe 7 (mas y continua com 19)
(*p)++; // incremento o conteúdo apontado por p (y++) ---> y = 20
x--; // decremento de x ---> x = 6
(*p) = (*p) + x; // o mesmo que y = y + x ---> y = 26
printf ("y = %d\n", y); // y = 26
*q = 10; // q não foi inicializada; não sabemos seu conteúdo, ou seja, para que endereço vai apontar; o problema ocorre porque tento escrever num endereço que não pertence à área do usuário.
return 0;
}
2) Comente o trecho abaixo linha-a-linha e mostre o que será impresso pelo comando printf:
int a = 10, b = 7, c; // 3 variáveis inteiras, 2 delas inicializadas (a e b)
int * p = &a; // p aponta para a variável 'a'
int * q = &b; // q aponta para a variável 'b'
int * r = &c; // r aponta para a variável 'c'
*r = *p; // equivalente a 'c = a' ---> c = 10
*p = *q; // equivalente a 'a = b' ---> a = 7
*q = *r; // equivalente a 'b = c' ---> b = 10
printf("%d - %d", a, b); // '7 - 10'
int * p = &a; // p aponta para a variável 'a'
int * q = &b; // q aponta para a variável 'b'
int * r = &c; // r aponta para a variável 'c'
*r = *p; // equivalente a 'c = a' ---> c = 10
*p = *q; // equivalente a 'a = b' ---> a = 7
*q = *r; // equivalente a 'b = c' ---> b = 10
printf("%d - %d", a, b); // '7 - 10'
3) Comente o trecho abaixo linha-a-linha e mostre o que será impresso pelo comando printf:
int vet[ ] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
int * p = &(vet[2]); // p aponta para o terceiro elemento (6)
int i;
for ( i = 1; i <= 6; i++ ) // roda 6 vezes
{ printf ("%d - ", *p);
p++;
}
int * p = &(vet[2]); // p aponta para o terceiro elemento (6)
int i;
for ( i = 1; i <= 6; i++ ) // roda 6 vezes
{ printf ("%d - ", *p);
p++;
}
Saída: 6 - 8 - 10 - 12 - 14 - 16 -
4) Por que o primeiro scanf abaixo usa o operador '&' e o segundo não?
int x;
scanf("%d", &x);
char nome[50];
scanf("%s", nome); // nome já é um ponteiro para o início da string por se tratar de um vetor.
scanf("%d", &x);
char nome[50];
scanf("%s", nome); // nome já é um ponteiro para o início da string por se tratar de um vetor.
Comentários
Postar um comentário