Baixe o app para aproveitar ainda mais
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); }
Compartilhar