Capítulo IX – Ponteiros 9.1 – Introdução 9.2 – Relação entre ponteiros e variáveis indexadas 9.3 – Alocação dinâmica de memória 9.4 – Variáveis indexadas,

Download Capítulo IX – Ponteiros 9.1 – Introdução 9.2 – Relação entre ponteiros e variáveis indexadas 9.3 – Alocação dinâmica de memória 9.4 – Variáveis indexadas,

Post on 17-Apr-2015

102 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

  • Slide 1
  • Captulo IX Ponteiros 9.1 Introduo 9.2 Relao entre ponteiros e variveis indexadas 9.3 Alocao dinmica de memria 9.4 Variveis indexadas, ponteiros e estruturas como parmetros e elementos de retorno 9.5 Subprogramas como parmetros 9.6 Encadeamento de estruturas
  • Slide 2
  • 9.3 Alocao Dinmica de Memria 9.3.1 Dispositivos para alocao dinmica Muitas vezes desejvel reservar espao para vetores e matrizes somente em tempo de execuo Muitas vezes desejvel reservar espao para vetores e matrizes somente em tempo de execuo Exemplo: seja a seguinte declarao: Exemplo: seja a seguinte declarao: int A[100][100];
  • Slide 3
  • Neste exemplo, supe-se que o nmero de linhas e colunas de A devam ser lidos durante a execuo desse programa Neste exemplo, supe-se que o nmero de linhas e colunas de A devam ser lidos durante a execuo desse programa Caso eles sejam bem menores que 100, haver grande desperdcio de memria Caso eles sejam bem menores que 100, haver grande desperdcio de memria Caso sejam maiores que 100, o espao reservado no ser suficiente para guardar os elementos de A Caso sejam maiores que 100, o espao reservado no ser suficiente para guardar os elementos de A conveniente alocar espao para os elementos dessa varivel depois de conhecidos os nmeros de linhas e de colunas conveniente alocar espao para os elementos dessa varivel depois de conhecidos os nmeros de linhas e de colunas
  • Slide 4
  • Na Linguagem C, a alocao de espao em tempo de execuo para vetores e matrizes s pode ser feita se esses forem declarados como ponteiros Na Linguagem C, a alocao de espao em tempo de execuo para vetores e matrizes s pode ser feita se esses forem declarados como ponteiros Esse tipo de alocao denomina-se alocao dinmica Esse tipo de alocao denomina-se alocao dinmica H uma regio da memria ocupada pelo programa denominada heap, destinada a essas alocaes dinmicas H uma regio da memria ocupada pelo programa denominada heap, destinada a essas alocaes dinmicas
  • Slide 5
  • A alocao pode ser feita pela funo malloc do arquivo stdlib.h A alocao pode ser feita pela funo malloc do arquivo stdlib.h malloc recebe como argumento o nmero de bytes a ser alocado malloc recebe como argumento o nmero de bytes a ser alocado malloc ento reserva na heap esse nmero de bytes de forma contgua malloc ento reserva na heap esse nmero de bytes de forma contgua O valor retornado por malloc o endereo do primeiro desses bytes (um ponteiro) O valor retornado por malloc o endereo do primeiro desses bytes (um ponteiro) Esses bytes ficam indisponveis para novas alocaes Esses bytes ficam indisponveis para novas alocaes
  • Slide 6
  • Exemplo: para alocar um vetor de 7 elementos do tipo int: Exemplo: para alocar um vetor de 7 elementos do tipo int: int *V; V = (int *) malloc (7 * sizeof (int)); heap V A converso (int *) necessria pois malloc retorna um ponteiro do tipo void int 4 bytes 28 bytes V pode ser usada como vetor
  • Slide 7 B[i])? A[i]: B[i]; for (i = 0; i < m; i++) printf ("%5d", C[i]); printf ("\n\nDigite algo para encerrar: "); getch (); printf ("\n\nDigite algo para encerrar: "); getch ();} Exemplo: seja o programa esquerda Tamanho dos vetores: 7 Vetor A: 28 39 84 27 82 49 10 Vetor B: 94 27 68 17 83 72 39 Vetor C: 94 39 84 27 83 72 39 Digite algo para encerrar: No vdeo">
  • #include #include typedef int *vetor; void main () { int m, i; vetor A, B, C; printf ("Tamanho dos vetores: "); scanf ("%d", &m); A = (int *) malloc (m*sizeof(int)); B = (int *) malloc (m*sizeof(int)); C = (int *) malloc (m*sizeof(int)); printf ("\nVetor A: "); for (i = 0; i < m; i++) scanf ("%d", &A[i]); printf ("\nVetor B: "); for (i = 0; i < m; i++) scanf ("%d", &B[i]); printf ("\nVetor C: "); for (i = 0; i < m; i++) C[i] = (A[i] > B[i])? A[i]: B[i]; for (i = 0; i < m; i++) printf ("%5d", C[i]); printf ("\n\nDigite algo para encerrar: "); getch (); printf ("\n\nDigite algo para encerrar: "); getch ();} Exemplo: seja o programa esquerda Tamanho dos vetores: 7 Vetor A: 28 39 84 27 82 49 10 Vetor B: 94 27 68 17 83 72 39 Vetor C: 94 39 84 27 83 72 39 Digite algo para encerrar: No vdeo
  • Slide 8
  • O lay-out da rea ocupada pelo programa planejado pelo compilador O lay-out da rea ocupada pelo programa planejado pelo compilador O gerenciamento durante a execuo fica por conta do prprio programa O gerenciamento durante a execuo fica por conta do prprio programa A rea total reservada para o programa fixa A rea total reservada para o programa fixa As regies das instrues e das variveis globais tambm tem tamanho fixo As regies das instrues e das variveis globais tambm tem tamanho fixo
  • Slide 9
  • As outras regies tem tamanho varivel durante a execuo As outras regies tem tamanho varivel durante a execuo A rea de dados das funes destina-se a guardar os parmetros, as variveis locais e informaes operacionais das verses ativas de funes num dado momento A rea de dados das funes destina-se a guardar os parmetros, as variveis locais e informaes operacionais das verses ativas de funes num dado momento Essa rea varia de tamanho, pois essas verses de funes no ficam ativas o tempo todo Essa rea varia de tamanho, pois essas verses de funes no ficam ativas o tempo todo
  • Slide 10
  • Quando uma verso de funo chamada para execuo, sua rea de dados carregada na memria Quando uma verso de funo chamada para execuo, sua rea de dados carregada na memria O carregamento feito a partir da fronteira com a rea desocupada O carregamento feito a partir da fronteira com a rea desocupada Quando sua execuo encerrada, sua rea retirada da memria, aumentando a rea desocupada Quando sua execuo encerrada, sua rea retirada da memria, aumentando a rea desocupada
  • Slide 11
  • A rea heap aumenta a partir de sua fronteira com a rea desocupada A rea heap aumenta a partir de sua fronteira com a rea desocupada Isso acontece quando uma alocao dinmica de memria feita (malloc ou outras do gnero) Isso acontece quando uma alocao dinmica de memria feita (malloc ou outras do gnero) A rea de dados das funes aumenta para baixo e a heap aumenta para cima A rea de dados das funes aumenta para baixo e a heap aumenta para cima
  • Slide 12
  • Nesse processo, se o programador no tomar cuidado, essas duas reas podem se encontrar Nesse processo, se o programador no tomar cuidado, essas duas reas podem se encontrar A, esgota-se a capacidade da rea desocupada A, esgota-se a capacidade da rea desocupada Novas chamadas de funes e novas alocaes dinmicas ficam impossibilitadas Novas chamadas de funes e novas alocaes dinmicas ficam impossibilitadas
  • Slide 13
  • A funo free torna a deixar disponvel a rea reservada numa alocao dinmica A funo free torna a deixar disponvel a rea reservada numa alocao dinmica Seu parmetro um ponteiro Seu parmetro um ponteiro Ela re-disponibiliza a rea previamente alocada e apontada por ele Ela re-disponibiliza a rea previamente alocada e apontada por ele Deve-se usar essa funo toda vez que uma alocao no tiver mais utilidade para o programa Deve-se usar essa funo toda vez que uma alocao no tiver mais utilidade para o programa
  • Slide 14
  • 9.3.2 Alocao dinmica de matrizes Usa-se ponteiro para vetor de ponteiros: Usa-se ponteiro para vetor de ponteiros: Ver programa a seguir
  • Slide 15
  • #include #include typedef int **matriz; void main () { int m, n, i, j; matriz A; printf ("Dimensoes de uma matriz: "); scanf ("%d%d", &m, &n); A = (int **) malloc (m * sizeof(int*)); for (i = 0; i < m; i++) A[i]= (int *) malloc (n * sizeof(int)); printf ("\nElementos da matriz:\n\n"); for (i = 0; i < m; i++) { printf ("\tLinha %d: ", i); for (j = 0; j < n; j++) scanf ("%d", &A[i][j]); } printf ("\nConfirmacao: \n\n"); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) printf ("%5d", A[i][j]); printf ("\n"); } printf ("\n\nDigite algo para encerrar: "); getch (); printf ("\n\nDigite algo para encerrar: "); getch ();} matriz o tipo ponteiro para ponteiros de int A partir deste ponto, A pode ser usada como uma matriz comum
  • Slide 16
  • Captulo IX Ponteiros 9.1 Introduo 9.2 Relao entre ponteiros e variveis indexadas 9.3 Alocao dinmica de memria 9.4 Variveis indexadas, ponteiros e estruturas como parmetros e elementos de retorno 9.5 Subprogramas como parmetros 9.6 Encadeamento de estruturas
  • Slide 17
  • 9.4 Variveis Indexadas, Ponteiros e Estruturas como Parmetros e Elementos de Retorno 9.4.1 Variveis indexadas e ponteiros como parmetros Em C, quando um dos parmetros de uma funo for declarado como varivel indexada, na realidade ele ser um ponteiro Em C, quando um dos parmetros de uma funo for declarado como varivel indexada, na realidade ele ser um ponteiro
  • Slide 18
  • Caso o argumento correspondente seja o nome de uma varivel indexada: Caso o argumento correspondente seja o nome de uma varivel indexada: O endereo correspondente aos seu nome passado ao ponteiro-parmetro O endereo correspondente aos seu nome passado ao ponteiro-parmetro Os elementos da varivel-argumento no so copiados para a funo Os elementos da varivel-argumento no so copiados para a funo Ento essa passagem de argumento por referncia Ento essa passagem de argumento por referncia Toda alterao nos elementos da varivel-parmetro ter efeito sobre aqueles da varivel-argumento Toda alterao nos elementos da varivel-parmetro ter efeito sobre aqueles da varivel-argumento Outros possveis argumentos: ponteiros e endereos Outros possveis argumentos: ponteiros e endereos
  • Slide 19
  • #include #include void Alterar (int B[]) { B[1] = B[3] = 7; } void main () { int i, A[10] = {0}; printf ("Vetor inicial : "); for (i = 0; i a = 5; p->b = 17.3; equivalem a (*p) uma estrutura sem nome">
  • typedef struct st st; struct st {int a; float b;}; st *p; p = (st *) malloc (sizeof(st)); Representao grfica: Representao grfica: Os parntesis so necessrios pois. tem precedncia sobre * Os parntesis so necessrios pois. tem precedncia sobre * Outra forma de referenciar os campos de uma estrutura apontada: Outra forma de referenciar os campos de uma estrutura apontada: ab p Atribuindo: (*p).a = 5; (*p).b = 17.3; 517.3 (*p).a = 5; (*p).b = 17.3; p->a = 5; p->b = 17.3; equivalem a (*p) uma estrutura sem nome
  • Slide 80 a); Um dos campos da estrutura st um ponteiro para uma estrutura de mesmo tipo (st)">
  • Exemplo: sejam as seguintes declaraes: Exemplo: sejam as seguintes declaraes: typedef struct st st; struct st {int a; st *prox;}; st *p, *q; e os seguintes comandos: p = (st *) malloc (sizeof(st)); p->a = 2; p->prox = (st *) malloc (sizeof(st)); p->prox->a = 3; p->prox->prox = (st *) malloc (sizeof(st)); p->prox->prox->a = 5; p->prox->prox->prox = NULL; for (q = p; q != NULL; q = q->prox) printf ("%4d", q->a); Um dos campos da estrutura st um ponteiro para uma estrutura de mesmo tipo (st)
  • Slide 81 a); p aprox 2 a 3 a 5 Formou-se um encadeamento de estruturas">
  • Seja a execuo dos comandos: Seja a execuo dos comandos: typedef struct st st; struct st {int a; st *prox;}; st *p, *q; p = (st *) malloc (sizeof(st)); p->a = 2; p->prox = (st *) malloc (sizeof(st)); p->prox->a = 3; p->prox->prox = (st *) malloc (sizeof(st)); p->prox->prox->a = 5; p->prox->prox->prox = NULL; for (q = p; q != NULL; q = q->prox) printf ("%4d", q->a); p aprox 2 a 3 a 5 Formou-se um encadeamento de estruturas
  • Slide 82 a); p aprox 2 a 3 a 5 q">
  • Seja a execuo dos comandos: Seja a execuo dos comandos: typedef struct st st; struct st {int a; st *prox;}; st *p, *q; p = (st *) malloc (sizeof(st)); p->a = 2; p->prox = (st *) malloc (sizeof(st)); p->prox->a = 3; p->prox->prox = (st *) malloc (sizeof(st)); p->prox->prox->a = 5; p->prox->prox->prox = NULL; for (q = p; q != NULL; q = q->prox) printf ("%4d", q->a); p aprox 2 a 3 a 5 q
  • Slide 83 a); p aprox 2 a 3 a 5 q 2 Vdeo">
  • Seja a execuo dos comandos: Seja a execuo dos comandos: typedef struct st st; struct st {int a; st *prox;}; st *p, *q; p = (st *) malloc (sizeof(st)); p->a = 2; p->prox = (st *) malloc (sizeof(st)); p->prox->a = 3; p->prox->prox = (st *) malloc (sizeof(st)); p->prox->prox->a = 5; p->prox->prox->prox = NULL; for (q = p; q != NULL; q = q->prox) printf ("%4d", q->a); p aprox 2 a 3 a 5 q 2 Vdeo
  • Slide 84 a); p aprox 2 a 3 a 5 q 2 Vdeo q">
  • Seja a execuo dos comandos: Seja a execuo dos comandos: typedef struct st st; struct st {int a; st *prox;}; st *p, *q; p = (st *) malloc (sizeof(st)); p->a = 2; p->prox = (st *) malloc (sizeof(st)); p->prox->a = 3; p->prox->prox = (st *) malloc (sizeof(st)); p->prox->prox->a = 5; p->prox->prox->prox = NULL; for (q = p; q != NULL; q = q->prox) printf ("%4d", q->a); p aprox 2 a 3 a 5 q 2 Vdeo q
  • Slide 85 a); p aprox 2 a 3 a 5 2 Vdeo q">
  • Seja a execuo dos comandos: Seja a execuo dos comandos: typedef struct st st; struct st {int a; st *prox;}; st *p, *q; p = (st *) malloc (sizeof(st)); p->a = 2; p->prox = (st *) malloc (sizeof(st)); p->prox->a = 3; p->prox->prox = (st *) malloc (sizeof(st)); p->prox->prox->a = 5; p->prox->prox->prox = NULL; for (q = p; q != NULL; q = q->prox) printf ("%4d", q->a); p aprox 2 a 3 a 5 2 Vdeo q
  • Slide 86 a); p aprox 2 a 3 a 5 2 3 Vdeo q">
  • Seja a execuo dos comandos: Seja a execuo dos comandos: typedef struct st st; struct st {int a; st *prox;}; st *p, *q; p = (st *) malloc (sizeof(st)); p->a = 2; p->prox = (st *) malloc (sizeof(st)); p->prox->a = 3; p->prox->prox = (st *) malloc (sizeof(st)); p->prox->prox->a = 5; p->prox->prox->prox = NULL; for (q = p; q != NULL; q = q->prox) printf ("%4d", q->a); p aprox 2 a 3 a 5 2 3 Vdeo q
  • Slide 87 a); p aprox 2 a 3 a 5 2 3 Vdeo qq">
  • Seja a execuo dos comandos: Seja a execuo dos comandos: typedef struct st st; struct st {int a; st *prox;}; st *p, *q; p = (st *) malloc (sizeof(st)); p->a = 2; p->prox = (st *) malloc (sizeof(st)); p->prox->a = 3; p->prox->prox = (st *) malloc (sizeof(st)); p->prox->prox->a = 5; p->prox->prox->prox = NULL; for (q = p; q != NULL; q = q->prox) printf ("%4d", q->a); p aprox 2 a 3 a 5 2 3 Vdeo qq
  • Slide 88 a); p aprox 2 a 3 a 5 2 3 Vdeo q">
  • Seja a execuo dos comandos: Seja a execuo dos comandos: typedef struct st st; struct st {int a; st *prox;}; st *p, *q; p = (st *) malloc (sizeof(st)); p->a = 2; p->prox = (st *) malloc (sizeof(st)); p->prox->a = 3; p->prox->prox = (st *) malloc (sizeof(st)); p->prox->prox->a = 5; p->prox->prox->prox = NULL; for (q = p; q != NULL; q = q->prox) printf ("%4d", q->a); p aprox 2 a 3 a 5 2 3 Vdeo q
  • Slide 89 a); p aprox 2 a 3 a 5 2 3 5 Vdeo q">
  • Seja a execuo dos comandos: Seja a execuo dos comandos: typedef struct st st; struct st {int a; st *prox;}; st *p, *q; p = (st *) malloc (sizeof(st)); p->a = 2; p->prox = (st *...

Recommended

View more >