Linguagem C Ponteiros Regis Pires Magalhães [email_address]
Ponteiros Ponteiros  são  variáveis  que  contém  endereços. Estas  variáveis apontam para algum determinado endereço da memória.  Em  geral, o  ponteiro  aponta  para  o endereço de alguma variável declarada no programa.  Para acessar o conteúdo de um ponteiro usamos: *nome_do_ponteiro O operador * determina o conteúdo de um endereço. A um ponteiro pode ser atribuído o valor nulo (constante NULL da biblioteca stdlib.h) Um ponteiro com valor NULL não aponta para lugar nenhum.
Declaração de Ponteiros Utiliza-se o operador unário * int  *ap_int; char  *ap_char; float  *ap_float; double  *ap_double; int  *ap1, *ap_2, *ap_3; int  *ap1, int1, int2;
Exemplo #include   <stdio.h> int  main() { int  x = 5; int  *px; px = &x; printf ( &quot;x: %d\n&quot; , x); printf ( &quot;px: %d\n&quot; , *px); return  0; }
Exemplo #include   <stdio.h> int  main() { int  x = 5; int  *px; px = &x; printf ( &quot;x: %d\n&quot; , x); printf ( &quot;px: %d\n&quot; , *px); x = 7; printf ( &quot;x: %d\n&quot; , x); printf ( &quot;px: %d\n&quot; , *px); *px = 3; printf ( &quot;x: %d\n&quot; , x); printf ( &quot;px: %d\n&quot; , *px); return  0; }
Ponteiro para char #include   <stdio.h> int  strtamanho( char  *str) { int  tamanho = 0; while  (*str) { tamanho++; str++; } return  tamanho; } int  main() { char  palavra[100]; printf ( &quot;Digite uma palavra: &quot; ); gets (palavra); printf ( &quot;O tamanho e: %d\n&quot; , strtamanho(palavra)); return  0; }
Ponteiro para char #include   <stdio.h> char  *strupper( char  *str) { char  *inicio; inicio = str; while  (*str) { *str = toupper(*str);  str++; } return  inicio; } int  main() { char  palavra[100]; printf ( &quot;Digite uma palavra: &quot; ); gets (palavra); printf ( &quot;Em caixa alta: %s\n&quot; , strupper(palavra)); return  0; }
Alocação Dinâmica Usada sempre que não se sabe exatamente quanto de memória será usado para uma determinada tarefa. Assim, reserva-se espaço da memória disponível (HEAP) à medida que mais memória torna-se necessária.  Também pode-se liberar posições de memória quando não forem mais necessárias. A memória é alocada não no início do programa, mas sim no decorrer de sua utilização do sistema. É como se pudéssemos definir um ARRAY com o seu tamanho sendo alterado à medida que fosse necessário.
Alocação dinâmica de memória A alocação dinâmica de memória é realizada através da função  malloc()   Ela aloca um bloco consecutivo de bytes na memória e retorna o endereço deste bloco. Protótipo: void *malloc (unsigned int num); Recebe o número de bytes que queremos alocar e retorna um ponteiro para o primeiro byte alocado. Se não houver memória suficiente, retorna um ponteiro nulo (NULL).
Alocação dinâmica de memória Função sizeof() Útil para saber o tamanho de um tipo. calloc  Semelhante a malloc, mas com protótipo um pouco diferente: void *calloc (unsigned int num, unsigned int size); Aloca uma quantidade de  memória igual  a num * size.
Alocação dinâmica de memória realloc  Protótipo: void *realloc (void *ptr, unsigned int num); Modifica  o  tamanho  da  memória  previamente  alocada  apontada  por  *ptr  para aquele especificado por num.  O valor de num pode ser maior ou menor que o original. Se  não  houver  memória  suficiente  para  a  alocação,  um ponteiro nulo é devolvido e o bloco original é deixado inalterado.
Liberação dinâmica de memória A liberação dinâmica de memória é realizada através da função  free()   Ela libera o uso de um bloco de memória.
Ponteiros para estruturas #include   <stdio.h> #include   <string.h> #include   <stdlib.h> struct  pessoa { char   nome [50]; int   idade ; }; typedef   struct  pessoa  Pessoa ; int  main() { Pessoa  *p = malloc( sizeof ( Pessoa )); strcpy (p-> nome , &quot;Regis&quot; ); p-> idade  = 18; printf ( &quot;Nome: %s - Idade: %d\n&quot; , p-> nome , p-> idade ); free(p); return  0; }
Exemplo #include   <stdio.h> #include   <string.h> #include   <stdlib.h> struct  pessoa { char   nome [50]; int   idade ; }; typedef   struct  pessoa  Pessoa ; int  main() { Pessoa  *p = malloc(2 *  sizeof ( Pessoa )); Pessoa  *inicio = p; strcpy (p-> nome , &quot;Regis&quot; ); p-> idade  = 18; p++; strcpy (p-> nome , &quot;Maria&quot; ); p-> idade  = 25; p = inicio; printf ( &quot;Nome: %s - Idade: %d\n&quot; , p-> nome , p-> idade ); p++; printf ( &quot;Nome: %s - Idade: %d\n&quot; , p-> nome , p-> idade ); free(inicio); return  0; }
Exemplo #include   <stdio.h> #include   <string.h> #include   <stdlib.h> struct  pessoa { char   nome [50]; int   idade ; }; typedef   struct  pessoa  Pessoa ; int  main() { Pessoa  *p = malloc(2 *  sizeof ( Pessoa )); strcpy (p[0]. nome , &quot;Regis&quot; ); p[0]. idade  = 18; strcpy (p[1]. nome , &quot;Maria&quot; ); p[1]. idade  = 25; printf ( &quot;Nome: %s - Idade: %d\n&quot; , p[0]. nome , p[0]. idade ); printf ( &quot;Nome: %s - Idade: %d\n&quot; , p[1]. nome , p[1]. idade ); free(p); return  0; }
Passagem parâmetros por referência A passagem de parâmetros por referência em C requer o uso de ponteiros.
Passagem parâmetros por referência #include   <stdio.h> void  troca( int  *x,  int  *y) { int  aux = *x; *x = *y; *y = aux; } int  main() { int  n1, n2; printf ( &quot;Digite n1: &quot; ); scanf ( &quot;%d&quot; , &n1); printf ( &quot;Digite n2: &quot; ); scanf ( &quot;%d&quot; , &n2); troca(&n1, &n2); printf ( &quot;n1 eh: %d\n&quot; , n1); printf ( &quot;n2 eh: %d\n&quot; , n2); return  0; }
Lista Encadeada Simples
Lista Encadeada Simples
Lista Encadeada Simples #include   <stdio.h> #include   <stdlib.h> typedef   struct  pessoa  Pessoa ; struct  pessoa { char   nome [50]; int   idade ; Pessoa  * proximo ; }; int  main() { Pessoa  *pAtual, *pInicio = NULL, *pAnterior = NULL; char  continua; do  { pAtual = malloc( sizeof ( Pessoa )); printf ( &quot;Digite um nome: &quot; ); gets (pAtual-> nome ); printf ( &quot;Digite a idade: &quot; ); scanf ( &quot;%d&quot; , &pAtual-> idade );  getchar (); if  (pInicio == NULL) { pInicio = pAtual; }  if  (pAnterior != NULL) { pAnterior-> proximo  = pAtual; } pAnterior = pAtual; printf ( &quot;Insere mais (S/N)? &quot; ); continua =  getchar ();  getchar (); }  while  (toupper(continua) !=  'N' ); pAtual = pInicio; while  (pAtual != NULL) { printf ( &quot;Nome: %s - Idade: %d\n&quot; , pAtual-> nome , pAtual-> idade ); pAtual = pAtual-> proximo ; } }

Mais conteúdo relacionado

PDF
Estrutura de Dados - Listas Encadeadas
PPTX
Linguagem C - Ponteiros
PPT
Logica Algoritmo 02 Algoritmo
PDF
Lista de exercicios algoritmos resolvida-
PPTX
Linguagem C - Estruturas
PPTX
Estrutura de Dados em Java (Introdução)
PPT
Algoritmo - tipos de dados
PPTX
Estrutura de Dados - Conceitos fundamentais
Estrutura de Dados - Listas Encadeadas
Linguagem C - Ponteiros
Logica Algoritmo 02 Algoritmo
Lista de exercicios algoritmos resolvida-
Linguagem C - Estruturas
Estrutura de Dados em Java (Introdução)
Algoritmo - tipos de dados
Estrutura de Dados - Conceitos fundamentais

Mais procurados (20)

PPTX
Linguagem C - Strings
PDF
Manual de portugol
PPT
Introdução a Linguagem C
PPSX
Lógica de Programação
DOCX
Metologia científica tcc pós
PPTX
Determinar frequências absoluta, relativa e relativa percentual
PPTX
Algoritmos - Vetores
PDF
Pseudocódigo ou Portugol (Lógica de Programação)
PDF
Estrutura de dados - Filas
PDF
Aula 7 - Expressões Aritméticas e Lógicas
PDF
Arrays (vetores) em Java
ODP
Lista Duplamente Encadeada
PDF
Teclas de atalho
PPS
Como fazer um resumo
ODP
Linguagem C 03 Estruturas De Decisao
PDF
Python - Introdução
PPTX
Algoritmos: Tipos de Dados
PPT
Apresentando a Linguagem de Programação Python
PDF
Lógica de programação em ppt
Linguagem C - Strings
Manual de portugol
Introdução a Linguagem C
Lógica de Programação
Metologia científica tcc pós
Determinar frequências absoluta, relativa e relativa percentual
Algoritmos - Vetores
Pseudocódigo ou Portugol (Lógica de Programação)
Estrutura de dados - Filas
Aula 7 - Expressões Aritméticas e Lógicas
Arrays (vetores) em Java
Lista Duplamente Encadeada
Teclas de atalho
Como fazer um resumo
Linguagem C 03 Estruturas De Decisao
Python - Introdução
Algoritmos: Tipos de Dados
Apresentando a Linguagem de Programação Python
Lógica de programação em ppt
Anúncio

Destaque (20)

PDF
Linguagem C - Funções e ponteiros
PDF
Revisão sobre ponteiros em C
PDF
Laboratório de Programação II: Tipo Abstrato de Dados (TAD)
PDF
Laboratório de Programação II: Uso do ponteiro void *
ODP
Linguagem C 02 String
ODP
Linguagem C 04 Estruturas De Repeticao
PPTX
ODP
Linguagem C 01 Primeiros Passos
ODP
Linguagem C 06 Funcoes
ODP
Linguagem C 05 Vetores E Matrizes
ODP
Linguagem C 08 Definicao De Tipos
ODP
Linguagem C 07 Registros
ODP
Linguagem C 10 Arquivos
PPTX
Introduction C Programming
PDF
Linguagem c
PPT
Brief introduction to the c programming language
PDF
ICC - Aula 04 - Expressões literais, comando de atribuição e de entrada/saída
PDF
Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...
PPTX
Introduction to c programming
PPT
Comandos de pascal e estrutura de repetição (para...fazer)
Linguagem C - Funções e ponteiros
Revisão sobre ponteiros em C
Laboratório de Programação II: Tipo Abstrato de Dados (TAD)
Laboratório de Programação II: Uso do ponteiro void *
Linguagem C 02 String
Linguagem C 04 Estruturas De Repeticao
Linguagem C 01 Primeiros Passos
Linguagem C 06 Funcoes
Linguagem C 05 Vetores E Matrizes
Linguagem C 08 Definicao De Tipos
Linguagem C 07 Registros
Linguagem C 10 Arquivos
Introduction C Programming
Linguagem c
Brief introduction to the c programming language
ICC - Aula 04 - Expressões literais, comando de atribuição e de entrada/saída
Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...
Introduction to c programming
Comandos de pascal e estrutura de repetição (para...fazer)
Anúncio

Semelhante a Linguagem C 09 Ponteiros (20)

PPT
C++ Standard Template Library
PDF
Conhecendo ou relembrando C
ODP
Workshop Python.1
PDF
unidade04-c3-handout.pdf
PDF
Linguagem c wellington telles - aula 03
ODP
Pymordida0 Semana de computação da SOCIESC - 2008/10
ODP
Python Emsl2009
PDF
Comandos de Controle de Programa em C
PDF
8 ponteiros, ponteiros e vetores e alocacao dinamica de memoria
DOCX
Biblioteca strings profª ms
PPTX
Introdução a ponteiros na linguagem C - Nível básico
ODP
Mini Curso de Python para Coding Dojo
PPTX
Aula 7 pc - estrutura
PDF
Aula de Algoritmos II - Turma 222
PPT
Logica Algoritmo 07 Subalgoritmos
C++ Standard Template Library
Conhecendo ou relembrando C
Workshop Python.1
unidade04-c3-handout.pdf
Linguagem c wellington telles - aula 03
Pymordida0 Semana de computação da SOCIESC - 2008/10
Python Emsl2009
Comandos de Controle de Programa em C
8 ponteiros, ponteiros e vetores e alocacao dinamica de memoria
Biblioteca strings profª ms
Introdução a ponteiros na linguagem C - Nível básico
Mini Curso de Python para Coding Dojo
Aula 7 pc - estrutura
Aula de Algoritmos II - Turma 222
Logica Algoritmo 07 Subalgoritmos

Mais de Regis Magalhães (20)

PDF
High Dimensional Data
PDF
Web Scale Data Management
PPTX
PHP 10 CodeIgniter
ODP
Prog web 01-php-introducao
ODP
Prog web 02-php-primeiros-passos
ODP
Prog web 00-modelo-cliente_servidor_web
ODP
Prog web 09-php-crud-mvc
ODP
Prog web 08-php-mvc
ODP
Prog web 07-pdo
ODP
Prog web 06-php-oo
ODP
Prog web 05-php-mysql
ODP
Prog web 04-php-gd
PPT
Prog web 03-php-sessoes-cookies_cabecalhos
ODP
Prog web 03-php-sessoes-cookies_cabecalhos
PPT
Prog web 02-php-primeiros-passos
ODP
Prog web 02-php-primeiros-passos
ODP
Prog web 00-modelo-cliente_servidor_web
ODP
Prog web 01-php-introducao
PDF
Linked Data Tutorial - Conferencia W3C Brasil 2011
PDF
Linked Data - Minicurso - SBBD 2011
High Dimensional Data
Web Scale Data Management
PHP 10 CodeIgniter
Prog web 01-php-introducao
Prog web 02-php-primeiros-passos
Prog web 00-modelo-cliente_servidor_web
Prog web 09-php-crud-mvc
Prog web 08-php-mvc
Prog web 07-pdo
Prog web 06-php-oo
Prog web 05-php-mysql
Prog web 04-php-gd
Prog web 03-php-sessoes-cookies_cabecalhos
Prog web 03-php-sessoes-cookies_cabecalhos
Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passos
Prog web 00-modelo-cliente_servidor_web
Prog web 01-php-introducao
Linked Data Tutorial - Conferencia W3C Brasil 2011
Linked Data - Minicurso - SBBD 2011

Linguagem C 09 Ponteiros

  • 1. Linguagem C Ponteiros Regis Pires Magalhães [email_address]
  • 2. Ponteiros Ponteiros são variáveis que contém endereços. Estas variáveis apontam para algum determinado endereço da memória. Em geral, o ponteiro aponta para o endereço de alguma variável declarada no programa. Para acessar o conteúdo de um ponteiro usamos: *nome_do_ponteiro O operador * determina o conteúdo de um endereço. A um ponteiro pode ser atribuído o valor nulo (constante NULL da biblioteca stdlib.h) Um ponteiro com valor NULL não aponta para lugar nenhum.
  • 3. Declaração de Ponteiros Utiliza-se o operador unário * 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 <stdio.h> int main() { int x = 5; int *px; px = &x; printf ( &quot;x: %d\n&quot; , x); printf ( &quot;px: %d\n&quot; , *px); return 0; }
  • 5. Exemplo #include <stdio.h> int main() { int x = 5; int *px; px = &x; printf ( &quot;x: %d\n&quot; , x); printf ( &quot;px: %d\n&quot; , *px); x = 7; printf ( &quot;x: %d\n&quot; , x); printf ( &quot;px: %d\n&quot; , *px); *px = 3; printf ( &quot;x: %d\n&quot; , x); printf ( &quot;px: %d\n&quot; , *px); return 0; }
  • 6. Ponteiro para char #include <stdio.h> int strtamanho( char *str) { int tamanho = 0; while (*str) { tamanho++; str++; } return tamanho; } int main() { char palavra[100]; printf ( &quot;Digite uma palavra: &quot; ); gets (palavra); printf ( &quot;O tamanho e: %d\n&quot; , strtamanho(palavra)); return 0; }
  • 7. Ponteiro para char #include <stdio.h> char *strupper( char *str) { char *inicio; inicio = str; while (*str) { *str = toupper(*str); str++; } return inicio; } int main() { char palavra[100]; printf ( &quot;Digite uma palavra: &quot; ); gets (palavra); printf ( &quot;Em caixa alta: %s\n&quot; , strupper(palavra)); return 0; }
  • 8. Alocação Dinâmica Usada sempre que não se sabe exatamente quanto de memória será usado para uma determinada tarefa. Assim, reserva-se espaço da memória disponível (HEAP) à medida que mais memória torna-se necessária. Também pode-se liberar posições de memória quando não forem mais necessárias. A memória é alocada não no início do programa, mas sim no decorrer de sua utilização do sistema. É como se pudéssemos definir um ARRAY com o seu tamanho sendo alterado à medida que fosse necessário.
  • 9. Alocação dinâmica de memória A alocação dinâmica de memória é realizada através da função malloc() Ela aloca um bloco consecutivo de bytes na memória e retorna o endereço deste bloco. Protótipo: void *malloc (unsigned int num); Recebe o número de bytes que queremos alocar e retorna um ponteiro para o primeiro byte alocado. Se não houver memória suficiente, retorna um ponteiro nulo (NULL).
  • 10. Alocação dinâmica de memória Função sizeof() Útil para saber o tamanho de um tipo. calloc Semelhante a malloc, mas com protótipo um pouco diferente: void *calloc (unsigned int num, unsigned int size); Aloca uma quantidade de memória igual a num * size.
  • 11. Alocação dinâmica de memória realloc Protótipo: void *realloc (void *ptr, unsigned int num); Modifica o tamanho da memória previamente alocada apontada por *ptr para aquele especificado por num. O valor de num pode ser maior ou menor que o original. Se não houver memória suficiente para a alocação, um ponteiro nulo é devolvido e o bloco original é deixado inalterado.
  • 12. Liberação dinâmica de memória A liberação dinâmica de memória é realizada através da função free() Ela libera o uso de um bloco de memória.
  • 13. Ponteiros para estruturas #include <stdio.h> #include <string.h> #include <stdlib.h> struct pessoa { char nome [50]; int idade ; }; typedef struct pessoa Pessoa ; int main() { Pessoa *p = malloc( sizeof ( Pessoa )); strcpy (p-> nome , &quot;Regis&quot; ); p-> idade = 18; printf ( &quot;Nome: %s - Idade: %d\n&quot; , p-> nome , p-> idade ); free(p); return 0; }
  • 14. Exemplo #include <stdio.h> #include <string.h> #include <stdlib.h> struct pessoa { char nome [50]; int idade ; }; typedef struct pessoa Pessoa ; int main() { Pessoa *p = malloc(2 * sizeof ( Pessoa )); Pessoa *inicio = p; strcpy (p-> nome , &quot;Regis&quot; ); p-> idade = 18; p++; strcpy (p-> nome , &quot;Maria&quot; ); p-> idade = 25; p = inicio; printf ( &quot;Nome: %s - Idade: %d\n&quot; , p-> nome , p-> idade ); p++; printf ( &quot;Nome: %s - Idade: %d\n&quot; , p-> nome , p-> idade ); free(inicio); return 0; }
  • 15. Exemplo #include <stdio.h> #include <string.h> #include <stdlib.h> struct pessoa { char nome [50]; int idade ; }; typedef struct pessoa Pessoa ; int main() { Pessoa *p = malloc(2 * sizeof ( Pessoa )); strcpy (p[0]. nome , &quot;Regis&quot; ); p[0]. idade = 18; strcpy (p[1]. nome , &quot;Maria&quot; ); p[1]. idade = 25; printf ( &quot;Nome: %s - Idade: %d\n&quot; , p[0]. nome , p[0]. idade ); printf ( &quot;Nome: %s - Idade: %d\n&quot; , p[1]. nome , p[1]. idade ); free(p); return 0; }
  • 16. Passagem parâmetros por referência A passagem de parâmetros por referência em C requer o uso de ponteiros.
  • 17. Passagem parâmetros por referência #include <stdio.h> void troca( int *x, int *y) { int aux = *x; *x = *y; *y = aux; } int main() { int n1, n2; printf ( &quot;Digite n1: &quot; ); scanf ( &quot;%d&quot; , &n1); printf ( &quot;Digite n2: &quot; ); scanf ( &quot;%d&quot; , &n2); troca(&n1, &n2); printf ( &quot;n1 eh: %d\n&quot; , n1); printf ( &quot;n2 eh: %d\n&quot; , n2); return 0; }
  • 20. Lista Encadeada Simples #include <stdio.h> #include <stdlib.h> typedef struct pessoa Pessoa ; struct pessoa { char nome [50]; int idade ; Pessoa * proximo ; }; int main() { Pessoa *pAtual, *pInicio = NULL, *pAnterior = NULL; char continua; do { pAtual = malloc( sizeof ( Pessoa )); printf ( &quot;Digite um nome: &quot; ); gets (pAtual-> nome ); printf ( &quot;Digite a idade: &quot; ); scanf ( &quot;%d&quot; , &pAtual-> idade ); getchar (); if (pInicio == NULL) { pInicio = pAtual; } if (pAnterior != NULL) { pAnterior-> proximo = pAtual; } pAnterior = pAtual; printf ( &quot;Insere mais (S/N)? &quot; ); continua = getchar (); getchar (); } while (toupper(continua) != 'N' ); pAtual = pInicio; while (pAtual != NULL) { printf ( &quot;Nome: %s - Idade: %d\n&quot; , pAtual-> nome , pAtual-> idade ); pAtual = pAtual-> proximo ; } }