Linguagem C 09 Ponteiros

Embed Size (px)

Citation preview

  • 1. Linguagem C Ponteiros Regis Pires Magalhes [email_address]

2. Ponteiros

  • Ponteirossovariveisquecontmendereos.
  • Estasvariveis apontam para algum determinado endereo da memria.
  • Emgeral, oponteiroapontaparao endereo de alguma varivel declarada no programa.
  • Para acessar o contedo de um ponteiro usamos:
    • *nome_do_ponteiro
  • O operador * determina o contedo de um endereo.
  • A um ponteiro pode ser atribudo o valor nulo (constante NULL da biblioteca stdlib.h)
    • Um ponteiro com valor NULL no aponta para lugar nenhum.

3. Declarao de Ponteiros

  • Utiliza-se o operador unrio *
    • int*ap_int;
    • char*ap_char;
    • float*ap_float;
    • double*ap_double;
    • int*ap1, *ap_2, *ap_3;
    • int*ap1, int1, int2;

4. Exemplo #include intmain() { intx = 5; int*px; px = &x; printf ( "x: %d " , x); printf ( "px: %d " , *px); return0; } 5. Exemplo #include intmain() { intx = 5; int*px; px = &x; printf ( "x: %d " , x); printf ( "px: %d " , *px); x = 7; printf ( "x: %d " , x); printf ( "px: %d " , *px); *px = 3; printf ( "x: %d " , x); printf ( "px: %d " , *px); return0; } 6. Ponteiro para char #include intstrtamanho( char*str) { inttamanho = 0; while(*str) { tamanho++; str++; } returntamanho; } intmain() { charpalavra[100]; printf ( "Digite uma palavra: " ); gets (palavra); printf ( "O tamanho e: %d " , strtamanho(palavra)); return0; } 7. Ponteiro para char #include char*strupper( char*str) { char*inicio; inicio = str; while(*str) { *str = toupper(*str);str++; } returninicio; } intmain() { charpalavra[100]; printf ( "Digite uma palavra: " ); gets (palavra); printf ( "Em caixa alta: %s " , strupper(palavra)); return0; } 8. Alocao Dinmica

  • Usada sempre que no se sabe exatamente quanto de memria ser usado para uma determinada tarefa.
  • Assim, reserva-se espao da memria disponvel (HEAP) medida que mais memria torna-se necessria.
  • Tambm pode-se liberar posies de memria quando no forem mais necessrias.
  • A memria alocada no no incio do programa, mas sim no decorrer de sua utilizao do sistema.
  • como se pudssemos definir um ARRAY com o seu tamanho sendo alterado medida que fosse necessrio.

9. Alocao dinmica de memria

  • A alocao dinmica de memria realizada atravs da funomalloc()
    • Ela aloca um bloco consecutivo de bytes na memria e retorna o endereo deste bloco.
    • Prottipo:
      • void *malloc (unsigned int num);
    • Recebe o nmero de bytes que queremos alocar e retorna um ponteiro para o primeiro byte alocado.
    • Se no houver memria suficiente, retorna um ponteiro nulo (NULL).

10. Alocao dinmica de memria

  • Funo sizeof()
    • til para saber o tamanho de um tipo.
  • calloc
    • Semelhante a malloc, mas com prottipo um pouco diferente:
      • void *calloc (unsigned int num, unsigned int size);
    • Aloca uma quantidade dememria iguala num * size.

11. Alocao dinmica de memria

  • realloc
    • Prottipo:
      • void *realloc (void *ptr, unsigned int num);
    • Modificaotamanhodamemriapreviamentealocadaapontadapor*ptrpara aquele especificado por num.
    • O valor de num pode ser maior ou menor que o original.
    • Senohouvermemriasuficienteparaaalocao,um ponteiro nulo devolvido e o bloco original deixado inalterado.

12. Liberao dinmica de memria

  • A liberao dinmica de memria realizada atravs da funofree()
    • Ela libera o uso de um bloco de memria.

13. Ponteiros para estruturas #include #include #include structpessoa { char nome [50]; int idade ; }; typedef structpessoaPessoa ; intmain() { Pessoa*p = malloc( sizeof ( Pessoa )); strcpy (p-> nome , "Regis" ); p-> idade= 18; printf ( "Nome: %s - Idade: %d " , p-> nome , p-> idade ); free(p); return0; } 14. Exemplo #include #include #include structpessoa { char nome [50]; int idade ; }; typedef structpessoaPessoa ; intmain() { Pessoa*p = malloc(2 *sizeof ( Pessoa )); Pessoa*inicio = p; strcpy (p-> nome , "Regis" ); p-> idade= 18; p++; strcpy (p-> nome , "Maria" ); p-> idade= 25; p = inicio; printf ( "Nome: %s - Idade: %d " , p-> nome , p-> idade ); p++; printf ( "Nome: %s - Idade: %d " , p-> nome , p-> idade ); free(inicio); return0; } 15. Exemplo #include #include #include structpessoa { char nome [50]; int idade ; }; typedef structpessoaPessoa ; intmain() { Pessoa*p = malloc(2 *sizeof ( Pessoa )); strcpy (p[0]. nome , "Regis" ); p[0]. idade= 18; strcpy (p[1]. nome , "Maria" ); p[1]. idade= 25; printf ( "Nome: %s - Idade: %d " , p[0]. nome , p[0]. idade ); printf ( "Nome: %s - Idade: %d " , p[1]. nome , p[1]. idade ); free(p); return0; } 16. Passagem parmetros por referncia

  • A passagem de parmetros por referncia em C requer o uso de ponteiros.

17. Passagem parmetros por referncia #include voidtroca( int*x,int*y) { intaux = *x; *x = *y; *y = aux; } intmain() { intn1, n2; printf ( "Digite n1: " ); scanf ( "%d" , &n1); printf ( "Digite n2: " ); scanf ( "%d" , &n2); troca(&n1, &n2); printf ( "n1 eh: %d " , n1); printf ( "n2 eh: %d " , n2); return0; } 18. Lista Encadeada Simples 19. Lista Encadeada Simples 20. Lista Encadeada Simples #include #include typedef structpessoaPessoa ; structpessoa { char nome [50]; int idade ; Pessoa* proximo ; }; intmain() { Pessoa*pAtual, *pInicio = NULL, *pAnterior = NULL; charcontinua; do{ pAtual = malloc( sizeof ( Pessoa )); printf ( "Digite um nome: " ); gets (pAtual-> nome ); printf ( "Digite a idade: " ); scanf ( "%d" , &pAtual-> idade );getchar (); if(pInicio == NULL) { pInicio = pAtual; }if(pAnterior != NULL) { pAnterior-> proximo= pAtual; } pAnterior = pAtual; printf ( "Insere mais (S/N)? " ); continua =getchar ();getchar (); }while(toupper(continua) !='N' ); pAtual = pInicio; while(pAtual != NULL) { printf ( "Nome: %s - Idade: %d " , pAtual-> nome , pAtual-> idade ); pAtual = pAtual-> proximo ; } }