(3.0 pontos) Simule a execução do programa abaixo, destacando o que vai ser impresso.
#include <stdio.h>
double fun1(int *x, int y);
void fun2(int *a, int *b);
int main()
{
int x = 1, y = 0;
double z = 5.0;
fun2(&x, &y);
printf("x = %d, y = %d, z = %.2f\n", x, y, z);
x = 1;
y = 4;
z = 3 * fun1(&x, y + 1);
printf("x = %d, y = %d, z = %.2f\n", x, y, z);
x = 1;
/* note que a função fun2 abaixo recebe &x e &x */
fun2(&x, &x);
printf("x = %d, y = %d, z = %.2f\n", x, y, z);
return 0;
}
double fun1(int *x, int y) {
int i;
i = *x;
*x = y;
y = i;
return (*x + y) / 2.0;
}
void fun2(int *a, int *b) {
*b += 2;
*a = *b + 1;
}
main
fun1
fun2
Saída do programa
#include <stdio.h>
double fun1(int *x, int y);
void fun2(int *a, int *b);
int main()
{
int x = 1, y = 0;
double z = 5.0;
fun2(&x, &y);
printf("x = %d, y = %d, z = %.2f\n", x, y, z);
x = 1;
y = 4;
z = 3 * fun1(&x, y + 1);
printf("x = %d, y = %d, z = %.2f\n", x, y, z);
x = 1;
/* note que a função fun2 abaixo recebe &x e &x */
fun2(&x, &x);
printf("x = %d, y = %d, z = %.2f\n", x, y, z);
return 0;
}
double fun1(int *x, int y) {
int i;
i = *x;
*x = y;
y = i;
return (*x + y) / 2.0;
}
void fun2(int *a, int *b) {
*b += 2;
*a = *b + 1;
}
main | fun1 | fun2 |
Passo 1
O enunciado apresenta um programa em C que explora passagem de parâmetro por referência (ponteiros) em fun2 e por referência/valor em fun1, usando as variáveis inteiras
x
e y
e a variável real z
. Nossa tarefa é simular cada chamada de função e registrar o que cada printf
imprime.Passo 2
No início de ,
e
.
Chama-se
main
temos
Chama-se
fun2(&x,&y)
. Em fun2(int *a, int *b)
:*b += 2
incrementay
de 0 para 2.*a = *b + 1
atribui ax
o valor.
Ao retornar,x=3
,y=2
ez
permanece.
O primeiroprintf
imprime
x, y , z
Passo 3
Em seguida, ajusta-se
,
e faz-se
.
Na chamada :
Na chamada
fun1(int *x, int y)
, onde o segundo argumento é
i = *x
guardaem i
.*x = y
alterax
para. y = i
atualiza a variável localy
para. - Retorna
.
De volta emmain
,x
vale, o y
externo continua(porque o y
da função era local) e.
O segundoprintf
imprime
x, y , z
Passo 4
Por fim, faz-se
e chama-se
fun2(&x,&x)
, ou seja, ambos os parâmetros apontam para a mesma variável x
. Dentro de fun2
:*b += 2
faz. *a = *b + 1
faz.
Ao retornar,x=4
, enquantoy
ez
não mudam (ficame , respectivamente).
O terceiroprintf
imprime
x, y , z
Resposta
x
, y
, z
x , y
, z
x , y
, z
x
x