Buscar

Slides 9 - Funções: Passagem por referência e introdução a ponteiros

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 3 páginas

Prévia do material em texto

Passagem de parâmetros por referência
Significa que os parâmetros passados para uma função correspondem a endereços de memória ocupados por variáveis.
Assim, a função que recebe os parâmetros pode modificá-lo.
Vantagem: possibilita o retorno de mais de uma variável (ocorre retorno pelos parâmetros).
Exemplo: função troca
void troca (int *px, int *py) // declara os endereços recebidos como ponteiros
{
int aux;
aux = *px;
*px = *py;
*py = aux;
}
main()
{
 int x = 3, y = 7;
troca(&x,&y); //envia endereços das variáveis
	printf(“%d %d”, x, y);	
}
Obs: *px e *py são apontadores para endereços de variáveis. São do tipo int porque contém endereços de variáveis do tipo int.
Exemplo2: função soma
int soma (int *a, int *b) // declara os endereços recebidos como ponteiros
{
int soma;
*a = 2 * (*a);
*b = 2 * (*b);
soma = *a + *b;
return(soma);
}
main()
{
 int x = 10, y = 20;
soma(&x,&y); //envia endereços das variáveis
	printf(“%d %d”, x, y);	
}
Ponteiros na Linguagem C
	Um ponteiro é uma variável que contém um endereço de memória. Esse endereço normalmente é a posição de uma outra variável na memória. 
	Quando uma variável possui o endereço de outra, isso significa que a primeira variável aponta para a segunda.
1. Uso de ponteiros
possibilita a passagem de parâmetros por referência;
manipulação de matrizes;
criar estruturas de dados complexas, como listas encadeadas e árvores binárias, em que uma estrutura de dados deve conter referências sobre outra;
alocação dinâmica de memória; (função malloc() que retorna a localização de memória livre através de ponteiros);
ponteiros tornam o programa mais eficiente.
2. Variáveis ponteiros
	A variável precisa ser declarada de forma a especificar que ela armazena um endereço.
	Ex: int *ptr1; char *ptr2;
3. Operadores para ponteiros
&: retorna o endereço de memória da variável.
* : retorna o valor da variável localizada no endereço que segue
	Na declaração * representa o tipo apontado, em outras instruções indica a variável apontada por.
Ponteiros devem sempre ser incializados com o valor 0 ou NULL.
4. Operações com Ponteiros
1. Atribuição: um endereço pode ser atribuído a um ponteiro. Ex: px = &x;
2. Acesso ao conteúdo: o operador unário trata seu operando como um endereço e acessa este endereço para buscar o conteúdo do objeto alvo. Ex: y = *px;
3. Incremento de ponteiro: incrementar um ponteiro acarreta movimentação do mesmo para o próximo tipo apontado. Ex: px++; (se px é um ponteiro para int e tem o valor 3000, após a execução do comando ele passa a ter o valor 3004)
4. Comparação entre ponteiros: é válido comparar duas variáveis do tipo ponteiro, que apontam para o mesmo tipo. Ex: if (px == py) if (px != NULL)
5. Ponteiros e vetores
	O compilador transforma vetores em ponteiros quando compila, pois a arquitetura do computador entende ponteiros e não vetores. Dessa forma, qualquer operação com os índices de um vetor pode ser feita com ponteiros.
	O nome do vetor é um endereço, ou seja, um ponteiro (ponteiro constante). Um ponteiro variável é um endereço onde é armazenado outro endereço.
Ex:
	void main()
{
	int num[] = {92, 81, 70, 69, 58}, d;
	for(d = 0; d < 5; d++)
		printf(“%d\n”, *(num+d));
	}
	*(matriz + índice) == matriz[índice]
	Ex: endereço de num = 3000
		&num[2] ==(num+2) = 3004
		num[2] == *(num+2) ==70
	3000
	[0]
	92
	3002
	[1]
	81
	3004
	[2]
	70
	3006
	[3]
	69
	3008
	[4]
	58
erro = *(num++) porque num é um ponteiro constante (mesmo que ocorre para constantes)
	
Faça o teste de mesa e entenda o que a função strs() está realizando.
	
	int strs(char *s)
{
 char *p = s;
 while(*p != ‘\0’)
 p++;
 return(p-s);
}

Outros materiais