25
Ponteiros Marco Antonio Montebello Júnior [email protected] Lab. de Programação de Computadores

Ponteiros Marco Antonio Montebello Júnior [email protected] Lab. de Programação de Computadores

Embed Size (px)

Citation preview

Page 1: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Ponteiros

Marco Antonio Montebello Jú[email protected]

Lab. de Programação de Computadores

Page 2: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Definição

Proporciona um modo de acesso a variáveis sem referenciá-las diretamente, utilizando para isto o endereço da variável.

A declaração “*” indica que uma variável é um ponteiro

Ps.: O uso descuidado de ponteiros pode levar a sérios bugs e a dores de cabeça terríveis :-).

Page 3: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Ponteiros Constantes

Não podem ser alterados e permanecem imutáveis durante a execução do programa.

Ex: int iNotas[10];

Para acessa a 1ª. posição do vetor pode-se usar: iNotas ou &iNotas[0]

2ª. Posição: &iNotas[1]

E assim sucessivamente...

Page 4: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Criando um Ponteiro

Criar uma variável para armazenar o endereço da variável iVar1, a qual iremos chamar de ipVar1

Nesse momento a variável ipVar1 não foi inicializada, apenas foi reservado um espaço para ela.

Page 5: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Criando um Ponteiro

Devemos armazenar o endereço de iVar1 na variável ipVar1.

Nesse momento podemos dizer que ipVar1 aponta para iVar1 ou é um ponteiro para iVar1

Ps.: Ponteiro é uma variável que contém o endereço de outra variável.

Page 6: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Declaração de Ponteiro

<tipo> * <pnome_variavel>;

<tipo> Tipo da variável para a qual o ponteiro estará apontando (int, float, char, ...)

* Operador de indireção e indica que a variavel é um ponteiro para o <tipo> declarado

<nome_variavel> Nome da variável, seguindo as regras de criação de nomes anteriores

Page 7: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Declaração de Ponteiro

<tipo> * <pnome_variavel>;

Antes do nome da variável deve existir o *. É declarado junto com as outras variáveis

Exemplos int *ipPonteiro; float *fpPonteiro; char *cpPonteiro;

Page 8: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Inicializando um Ponteiro

int iNum, *ipNum;

int iVet[10], &ipVet;

int iMat[5][7], &ipMat;

//Atribuindo os endereços

ipNum =&iNum;

ipVet = iVet; //ipVetor = iVetor[0];

ipMat = iMat; //ipMat = iMat[0];

Page 9: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Ponteiros e Strings

Declarando uma mensagem como um ponteiro constante char cMsg [10] = “Saudacoes”;

Declarando uma mensagem como ponteiro variável char *cpMsg = “Saudacoes”;

Page 10: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Matriz de Ponteiros

Matriz constantechar cLista[5][10] = {"Katarina",

"Diogo","Gustavo","Francisco",

"Airton"}; Matriz variávelchar *cpLista[5] = {"Katarina",

"Diogo"," Gustavo","Francisco","Airton"};

Page 11: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Matriz de Ponteiros (1)

Page 12: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Matriz de Ponteiros (2)

Page 13: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Dicas sobre Ponteiro

Acessar o endereço da variável ponteiro fpPonteiro printf(“Endereço %f.”, fpPonteiro);

Acessar o conteúdo da variável ponteiro *fpPonteiro printf(“Conteúdo: %f.”, *fpPonteiro);

Page 14: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Dicas sobre Ponteiro

Acessar o próximopróximo endereço de um ponteiro fpVet++; fpVet = fpVet + n;//n=num de bytes a percorrer fpVet += n;

Acessar o endereço anterioranterior de um ponteiro fpVet--; fpVet = fpVet - n;//n=num de bytes a percorrer fpVet -= n;

Page 15: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Dicas sobre Ponteiro

Operações equivalentes

fVet[2] == *(fpVet + 2) &fVet[2] == (fpVet + 2)

Page 16: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Alocação Dinâmica

Aloca espaço na memória durante a execução do programa (em tempo de execução)

Existem funções para alocar, desalocar, realocar e limpar a memória que foi alocada

Usuar a biblioteca stdlib.h #include <stdlib.h>

Page 17: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Função: Sizeof

Indica o tamanho em bytes de uma variável. sizeof(<tipo>); Tipo: char, int, float, ...

printf(“Tam. int: %i.”, sizeof(int)); //4 bytes

printf(“Tam. float: %i.”, sizeof(float)); //4 bytes

printf(“Tam. double: %i.”, sizeof(double));//8 bytes

printf(“Tam. char: %i.”, sizeof(char)); //1 byte

Page 18: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Heap Área de Alocação Dinâmica

Consiste de toda a memória disponível que não foi usada para outro propósito.

“É o resto da memória” É possível alocar ou liberar dinamicamente a

memória do heap através da funções: malloc() calloc() realloc() free()

Page 19: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Função: Malloc

Aloca a quantidade de bytes desejada pelo usuário.

malloc(<tamanho>);

int *ipNum1, *ipNum2;

ipNum1 = (int *) malloc(4); //Aloca 4 bytes

//5 variáveis inteiras = 5 * 4 = 20 bytes

ipNum2 = malloc(5 * sizeof(int));

Page 20: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Função: Malloc

A expressão (int *) é utilizado pois a função malloc(), retorna um ponteiro para o tipo void, portanto esse ponteiro deve ser moldado para o tipo de dado apropriado.

É um operador unário chamado de operador molde ou cast.

Page 21: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Função: Calloc

Aloca memória para um grupo de objetos calloc(<tamanho>, <tam_obj);

int *ipNum1, *ipNum2;

ipNum1 = (int *) calloc(2, 4); //Aloca 8 bytes

//5 variáveis inteiras = 5 * 4 = 20 bytes

ipNum2 = (int *) calloc(5, sizeof(int));

Page 22: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Função: Realloc

Altera o tamanho de um bloco de memória que foi alocado através do malloc() ou do calloc()

realloc(<*ptr>, <tamanho>);int *ipNum1, *ipNum2;

ipNum1 = (int *) calloc(2, 4); //Aloca 8 bytes

//5 variáveis inteiras = 5 * 4 = 20 bytes

ipNum2 = (int *) calloc(5, sizeof(int));

ipNum2 = (int *) realloc(ipNum2, sizeof(int) * 10);

Page 23: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Função: Free Limpa um espaço de memória que foi alocado free(<*ptr>)

int *ipNum1, *ipNum2;

ipNum1 = (int *) calloc(2, 4); //Aloca 8 bytes

//5 variáveis inteiras = 5 * 4 = 20 bytes

ipNum2 = (int *) calloc(5, sizeof(int));

//Liberando a memória alocada para ipNum1 e ipNum2

free(ipNum1);

free(ipNum2);

Page 24: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Exercício

Alocar espaço para um vetor inteiro com 10 posições. Receber do usuário, os valores do vetor. Mostrar o endereço e o respectivo valor de cada elemento da matriz.

Em seguida, alterar esses valores, somando 10 a cada elemento. Mostrar novamente o endereço (que deve ser o mesmo) com o novo valor. Utilizar alocação dinâmica e ponteiros, não declarar vetor.

Page 25: Ponteiros Marco Antonio Montebello Júnior marco.antonio@aes.edu.br Lab. de Programação de Computadores

Exercício

Aloque espaço para uma seqüência de 5 números reais. Receba do usuário os valores e imprima-os em ordem inversa. Utilizar alocação dinâmica e ponteiros, não declarar vetor.

Altere o exercício anterior de maneira que o usuário indique a quantidade de elementos que ele deseja alocar.