ponteiros - deinf/ufmageraldo/lpnovo/9.ponteiros.pdf · atividades escreva um programa em c que...

22
Introdução e Alocação Dinâmica Ponteiros

Upload: hadien

Post on 12-Dec-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Introdução e Alocação Dinâmica

Ponteiros

Page 2: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Conceito Um PONTEIRO ou APONTADOR é uma

variável usada para armazenar um endereço de memória.

Normalmente, o endereço armazenado em um PONTEIRO é a posição de uma outra variável na memória.

Se uma variável contém o endereço e uma outra, então a primeira variável é dita apontar para a segunda.

2

Page 3: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Conceito

3

Page 4: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Declaração De maneira geral, uma variável ponteiro de

nome ID é declarada assim:

ESPECIFICADORES * ID = INICIALIZADOR;

onde, o = INICIALIZADOR é opcional (como em toda declaração de variável).

4

Page 5: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Operadores de Ponteiros Existem dois operadores especiais para

ponteiros: o * e o &.

5

Page 6: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Operador &

Um operador unário que devolve o endereço na memória do seu operando.

int m; int * p; p = &m; /* p recebe o endereço onde se localiza a var. m */ ...

6

Page 7: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Operador *

É o complemento de &. Quer dizer, devolve a variável localizada no endereço armazenado em um apontador.

p = &m; m = 3; printf("%p", p); /* imprime o endereço de m */ printf("%d", *p); /* imprime 3 que é o conteúdo de m */ ...

7

Page 8: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Ponteiros e Arranjos

Há uma estreita relação entre PONTEIROS e ARRANJOS (vetores, matrizes e strings). O nome de um ARRANJO (vetor, matriz ou string) é sempre um PONTEIRO para o primeiro elemento do ARRANJO.

char str[80], *pstr; pstr = str; /* pstr aponta para str[0] */

8

Page 9: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Ponteiros e Arranjos

Assim, a décima posição de um ARRANJO (vetor, matriz ou string) pode ser acessada de duas maneiras:

pstr = str; /* pstr aponta para str[0] */ printf("%c", str[9] ); /* imprime o 10o elemento de str */ printf("%c",*(pstr + 9)); /* imprime o 10o elemento de str */

9

Page 10: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Aritmética de Ponteiros Existem apenas duas operações aritméticas

que podem ser usadas com ponteiros: adição e subtração.

Cada vez que um ponteiro é incrementado, ele aponta para a posição de memória do próximo elementodo seu tipo base.

Cada vez que um ponteiro é decrementado, ele aponta para a posição de memória do elemento anterior.

10

Page 11: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Aplicações O correto entendimento e uso de ponteiros é

crítico para uma programação bem-sucedida em C. Há pelo menos três razões para isto:

ponteiros fornecem os meios pelos quais as funções podem modificar seus argumentos

formam a base para a alocação dinâmica (variáveis no heap)

aumenta a eficiência de certas rotinas

De agora em diante, até o final do curso, iremos explorar em variados graus de detalhes o conceito básico de ponteiros.

11

Page 12: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Atividades Escreva um programa em C que preencha

um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor na posição do vetor e o endereço de memória que se encontra aquele valor.

Escreva um programa em C que inicializa uma string de caracteres e percorre essa string usando aritmética de ponteiros.

12

Page 13: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Alocação Dinâmica ALOCAÇÃO DINÂMICA é o processo através

do qual um programa pode criar novas variáveis (áreas de memória) em tempo de execução.

Variáveis alocadas dinâmicamente são criadas em uma área de memória livre chamada de HEAP e são acessadas através de PONTEIROS.

13

Page 14: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Heap

14

Page 15: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Funções de Alocação Dinâmica – ANSI - #include <stdlib.h>

void * calloc(size_t num, size_t size);

Aloca uma quantidade de memória igual a num*size. Isto é, aloca memória suficiente para um ARRANJO de num VARIÁVEIS de tamanho size.

Devolve o endereço para o primeiro byte da região alocada. Se não houver memória suficiente para satisfazer a solicitação, é devolvido NULL (endereço nulo).

15

Page 16: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Funções de Alocação Dinâmica – ANSI - #include <stdlib.h>

void * malloc(size_t size);

Aloca uma quantidade de memória igual a size. Isto é, aloca memória suficiente para uma VARIÁVEL de tamanho size.

Devolve o endereço para o primeiro byte da região alocada. Se não houver memória suficiente para satisfazer a solicitação, é devolvido NULL (endereço nulo).

16

Page 17: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Funções de Alocação Dinâmica – ANSI - #include <stdlib.h>

void * realloc(void * ptr, size_t size);

Modifica o tamanho da memória previamente alocada apontada por ptr para um novo tamanho especificado por size. O valor size pode ser maior ou menor que o original.

Retorna o endereço para o primeiro byte da região de memória redimensionada. Se não houver memória suficiente no HEAP para

satisfazer a solicitação, é devolvido NULL (endereço nulo) e o endereço originalmente em ptr é deixado inalterado.

17

Page 18: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Funções de Alocação Dinâmica – ANSI - #include <stdlib.h>

void free(void * ptr);

Devolve ao HEAP a memória apontada por ptr, tornando a memória disponível para alocação futura.

Deve ser chamada somente com um PONTEIRO ptr cujo endereço de memória foi previamente alocado por meio de uma das funções do sistema de alocação dinâmica (calloc(), malloc(), realloc()).

18

Page 19: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Outras - #include <string.h> char * strdup(const char * pstr);

Duplica a STRING apontada por pstr. Ou seja, aloca no HEAP strlen(pstr)+1 bytes e copia a STRING começando em pstr para o endereço alocado.

Retorna o endereço alocado contendo uma cópia da STRING apontada por pstr ou NULL caso não haja memória suficiente no HEAP.

19

Page 20: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Exemplo Outras Ex.: O trecho de código abaixo:

É equivalente a:

20

char str[] = "Teste";

char * pstr = strdup(str);

char str[] = "Teste";

char * pstr = calloc(strlen(str) + 1, sizeof char);

strcpy(pstr,str);

Page 21: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Atividades Escreva um programa que leia um vetor com N

elementos inteiros. A seguir, em uma função separe o vetor em dois outros vetores, um com os elementos positivos e zero e outro com os valores negativos.

Construa um programa (main) que aloque em tempo de execução (dinamicamente) uma matriz de ordem m x n (linha por coluna), usando 1+m chamadas a função malloc. Agora, aproveite este programa para construir uma função que recebendo os parametros m e n aloque uma matriz de ordem m x n e retorne um ponteiro para esta matriz alocada. Crie ainda uma função para liberar a área de memória alocada pela matriz. Finalmente, crie um novo programa (main) que teste/use as duas funções criadas acima.

21

Page 22: Ponteiros - DEINF/UFMAgeraldo/lpnovo/9.ponteiros.pdf · Atividades Escreva um programa em C que preencha um vetor de 10 números com os valores: 1,2... 10. Depois imprima o valor

Atividades

Escreva um programa que leia para um vetor um conjunto de números inteiros. Assuma que o conjunto de números lidos é menor que o tamanho do vetor. O programa deve inserir no vetor em uma posição especificada pelo usuário um número lido do teclado. Assuma que a posição especificada pelo usuário corresponde ao índice do vetor.

22