Estrutura de Dados
Passagem por Referência
Memória
0000 0008 0012
0016 0020 0021 0025 0029 Gasto de memória das
variáveis:
int: 4bytes char: 1byte float: 4bytes double: 8 bytes
double int / float
int/float int/float
char
int/float int/float
. . .
Memória
0000 0008 0012
0016 0020 0021 0025 0029
Endereço Valor
Identificadores
Declaração:
int x, y, z int *p;
p x y
z
Memória
0000 0008 0012
0016 0020 0021 0025 0029
Endereço Valor
Identificadores
Declaração:
int x, y, z int *p;
x = 10;
y = 20;
z = 30;
p = &y;
p x y
z
10 20
30 0016
Memória
0000 0008 0012
0016 0020 0021 0025 0029
Endereço Valor
Identificadores
Declaração:
int x, y, z int *p;
x = 10;
y = 20;
z = 30;
p = &x;
p x y
z
10 20
30 0012
Memória
0000 0008 0012
0016 0020 0021 0025 0029
Endereço Valor
Identificadores
Declaração:
int x, y, z int *p;
x = 10;
y = 20;
z = 30;
p = &x;
p++;
p x y
z
10 20
30 0016
Memória
0000 0008 0012
0016 0020 0021 0025 0029
Endereço Valor
Identificadores
Declaração:
int x, y, z int *p;
x = 10;
y = 20;
z = 30;
p = &x;
p++;
*p = *p + 10;
p x y
z
10 20
30 0016
*p = 30
Ponteiros
• Operadores unários
– & *
• &: serve para retornar o endereço de uma variável;
• *: serve para obter o valor da variável que
está armazenada em determinado ponteiro;
Exemplo
int main() {
int x, y, *p;
x = 5;
y = 10;
p = &x;
*p += y;
printf(“%d”, x);
return 0;
}
p
x y
000 004 008
016 020 008
5
10 15
15
A passagem de parâmetros
• Toda função define um processamento a ser realizado.
• Este processamento pode depender ou não
dos valores dos parâmetros da função.
A passagem de parâmetros
• O mecanismo de informar os valores a serem processados pela função chama-se passagem de parâmetros.
• A Linguagem C define duas categorias de passagem de parâmetros:
– passagem por valor e
– passagem por endereço (ou passagem por referência).
A passagem de parâmetros
• Normalmente, a passagem de parâmetros a uma função é por valor.
• Mas, como os parâmetros de uma função são
variáveis locais, alguns aspectos devem ser
observados
Exemplo 1
void alterar(int x, int y, int z) {
printf(“Os valores recebidos %d %d %d\n”, x,y,z);
x++;
y++;
z++;
printf(“Os valores alterados %d %d %d\n”, x,y,z);
}
int main() {
int a = 1,b = 2,c = 3;
alterar(a, b, c);
printf(“Dados finais: %d %d %d\n”, a, b, c);
}
Resposta no quadro!
• Observe que os valores das variáveis a, b e c não foram modificados na função alterar.
• Por quê?
• O tipo de passagem de parâmetros utilizado é por valor.
• Ou seja, são feitas apenas cópias dos valores
das variáveis a, b, e c nas variáveis x, y e z.
• Mas o que podemos fazer?
int int int alterar(int x, int y, int z) {
printf(“Os valores recebidos %d %d %d\n”, x,y,z);
x++;
y++;
z++;
return x,y,z;
}
Mas isso não é valido, pois a função em C não retorna vários valores!
Passagem por referência
• Mas, e se quisermos que a função modifique os valores das variáveis a, b e c passadas a ela como parâmetros?
• Neste caso, em vez de passar para a função os valores destas variáveis, é preciso passar os seus endereços.
• Como assim?
Exemplo 2
void alterar(int *x, int *y, int *z) {
printf(“Os valores recebidos %d %d %d\n”, *x,*y,*z);
(*x)++;
(*y)++;
(*z)++;
printf(“Os valores alterados %d %d %d\n”, *x,*y,*z);
}
int main() {
int a = 1,b = 2,c = 3;
alterar(&a, &b, &c);
printf(“Dados finais: %d %d %d\n”, a, b, c);
}
Resposta no quadro!
Passagem por referência
• Considere uma variável declarada como:
– int *x;
• x é um ponteiro para int, ou seja, x é uma variável que armazena o endereço de uma variável do tipo int.
• Considere agora que:
• Neste caso, x armazena o valor 000.
– x = &a;
• Define-se *x, como sendo o valor contido na posição de memória apontada por x. Ou seja, *x vale 1.
Exercícios
• Criar um programa em C que realize a soma de dois números inteiros.
– A soma tem que ocorrer uma função e a função não retorna nenhum valor;
– Os parâmetros da função são os dois números passados por valor e um resultado passado por endereço.
Exercícios
• Criar um programa em C que realize a troca de valores entre duas variáveis.
– A troca precisa ser realizada em uma função e a passagem de parâmetros precisa ser por referência.
– Ex.
– Inicio: a = 10, b = 5;
– Final: a = 5, b = 10;
– Dica: usar uma variável auxiliar