Transcript
Page 1: Estrutura de Dados - Ponteiros

Prof. Adriano Teixeira de Souza

Page 2: Estrutura de Dados - Ponteiros

A memória de qualquer computador é uma seqüência de bytes.

Cada byte pode armazenar um número inteiro entre 0 e 255.

Cada byte na memória é identificado por um endereço numérico, independente do seu conteúdo.

Prof. Adriano Teixeira de Souza

Page 3: Estrutura de Dados - Ponteiros

Prof. Adriano Teixeira de Souza

1011 0011

1111 0101

0101 1010

0001 1001

0000 0001 0x0022FF16

0x0022FF17

0x0022FF18

0x0022FF19

0x0022FF1A

Endereço Conteúdo

Page 4: Estrutura de Dados - Ponteiros

Cada objeto (variáveis, strings, vetores, etc.) que reside na memória do computador ocupa um certo número de bytes: ◦ Inteiros: 4 bytes consecutivos ◦ Caracteres: 1 byte ◦ Ponto-flutuante: 4 bytes consecutivos

Cada objeto tem um endereço.

Prof. Adriano Teixeira de Souza

Page 5: Estrutura de Dados - Ponteiros

Prof. Adriano Teixeira de Souza

1011 0011

1111 0101

0101 1010

0001 1001

0000 0001

0x0022FF10

Endereço

1011 0011

1111 0101

0101 1010

0001 1001

0000 0001

1011 0011

1111 0101

0101 1010

0001 1001

0000 0001

1011 0011

1111 0101

0101 1010

0001 1001

0000 0001

1011 0011

1111 0101

0101 1010

0001 1001

0x0022FF14

0x0022FF24

char string[4]

float real[4]

char string1[4]

Variável Valor

Page 6: Estrutura de Dados - Ponteiros

Ao declararmos uma variável x como acima, temos associados a ela os seguintes elementos:

◦ Um nome (x) ◦ Um endereço de memória ou referência (0xbfd267c4) ◦ Um valor (100)

Para acessarmos o endereço de uma variável, utilizamos o operador &

Prof. Adriano Teixeira de Souza

int x = 100;

Page 7: Estrutura de Dados - Ponteiros

Um ponteiro (apontador ou pointer) é um tipo especial de variável cujo valor é um endereço.

Um ponteiro pode ter o valor especial NULL, quando não contém nenhum endereço.

NULL é uma constante definida na biblioteca stdlib.h.

Prof. Adriano Teixeira de Souza

Page 8: Estrutura de Dados - Ponteiros

A expressão acima representa o conteúdo do endereço de memória guardado na variável var

Ou seja, var não guarda um valor, mas sim um endereço de memória.

Prof. Adriano Teixeira de Souza

*var

Page 9: Estrutura de Dados - Ponteiros

Prof. Adriano Teixeira de Souza

int x;

int *ap; // apontador para inteiros

ap = &x; // ap aponta para x

0x0022FF10

0x0022FF14

x

1111 0101

0101 1010

0001 1001

0000 0001

ap

0001 0000 (10)

1111 1111 (FF)

0010 0010 (22)

0000 0000 (00)

Page 10: Estrutura de Dados - Ponteiros

Há vários tipos de ponteiros: ◦ ponteiros para caracteres

◦ ponteiros para inteiros

◦ ponteiros para ponteiros para inteiros

◦ ponteiros para vetores

◦ ponteiros para estruturas

O compilador C faz questão de saber de que tipo de ponteiro você está definindo.

Prof. Adriano Teixeira de Souza

Page 11: Estrutura de Dados - Ponteiros

Prof. Adriano Teixeira de Souza

int *ap_int; // apontador para int

char *ap_char; // apontador para char

float *ap_float; // apontador para float

double *ap_double; // apontador para double

// apontador para apontador

int **ap_ap_int;

Page 12: Estrutura de Dados - Ponteiros

Um conjunto limitado de operação aritméticas pode ser executado.

Os ponteiros são endereços de memória. Assim, ao somar 1 a um ponteiro, você estará indo para o próximo endereço de memória do tipo de dado especificado.

Prof. Adriano Teixeira de Souza

Page 13: Estrutura de Dados - Ponteiros

Prof. Adriano Teixeira de Souza

ap

18

FF

22

00

int *ap;

14

FF

22

00

ap+1

10

FF

22

00

ap+2

Page 14: Estrutura de Dados - Ponteiros

Sempre que somar ou subtrair ponteiros, deve-se trabalhar com o tamanho do tipo de dado utilizado.

Para isso você pode usar o operador sizeof().

Prof. Adriano Teixeira de Souza

Page 15: Estrutura de Dados - Ponteiros

O while deve ser usado sempre que: ◦ Não soubermos exatamente quantas vezes o laço

deve ser repetido ◦ O teste deva ser feito antes de iniciar a execução de

um bloco de comandos ◦ Houver casos em que o laço não deva ser repetido

nenhuma vez antes do teste da condição

Atenção:

◦ As variáveis usadas no teste devem ser inicializadas antes do teste.

Prof. Adriano Teixeira de Souza

Page 16: Estrutura de Dados - Ponteiros

Permite que um certo trecho de programa seja executado ATÉ QUE uma certa condição deixe de ser verdadeira:

do

{

<comandos_a_repetir>

} while (<condição>);

<comandos_após_laço_do-while>

Prof. Adriano Teixeira de Souza

Page 17: Estrutura de Dados - Ponteiros

Funcionamento: 1.Executar os comando dentro do bloco do-while.

2.Testar a condição.

3.Se a condição for falsa, então sair do laço.

4.Se a condição for verdadeira, então retornar para o passo 1.

Prof. Adriano Teixeira de Souza

Page 18: Estrutura de Dados - Ponteiros

O comando do-while deve ser usado sempre que:

◦ Não soubermos exatamente quantas vezes o laço deve ser repetido

◦ O teste deva ser feito depois da execução de um bloco de comandos

◦ O bloco de comandos deve se executado pelo menos uma vez

Prof. Adriano Teixeira de Souza

Page 19: Estrutura de Dados - Ponteiros

Ler um número e verificar se este é ou não um número primo.

Dada uma dívida de 10 mil reais que cresce a juros de 2,5% ao mês e uma aplicação de 1.500 reais com rendimento de 4% ao mês, escrever um algoritmo que determine o numero de meses necessários para pagar a dívida.

Prof. Adriano Teixeira de Souza

Page 20: Estrutura de Dados - Ponteiros

Permite que um certo trecho de programa seja executado um número determinado de vezes.

for (comandos_inic; condição_teste; incre/decremento)

{

<comandos_a_repetir>

}

<comandos_após_laço_for>;

Prof. Adriano Teixeira de Souza

Page 21: Estrutura de Dados - Ponteiros

Funcionamento:

1.Executar os comandos de inicialização.

2.Testar a condição.

3.Se a condição for falsa então sair do laço for.

4.Se a condição for verdadeira então executar os comandos que estão subordinados ao for.

5.Executar os comandos de incremento/decremento.

6.Voltar ao passo 2.

Prof. Adriano Teixeira de Souza

Page 22: Estrutura de Dados - Ponteiros

Observações:

◦ Os comandos de inicialização são executados apenas uma vez.

◦ O contador é incrementado/decrementado sempre ao final da execução do bloco.

◦ O teste é feito sempre antes do início da execução do bloco de comandos.

Prof. Adriano Teixeira de Souza

Page 23: Estrutura de Dados - Ponteiros

O comando for deve ser usado sempre que:

◦ Soubermos exatamente quantas vezes o laço deve ser repetido.

◦ O teste deva ser feito antes da execução de um bloco de comandos.

◦ Houver casos em que o laço não deva ser repetido nenhuma vez.

Prof. Adriano Teixeira de Souza

Page 24: Estrutura de Dados - Ponteiros

Comandos for aninhados ◦ Um comando for pode ser utilizado dentro de

outro comando for.

◦ Cuidados devem ser tomados para não aumentar o tempo de execução do algoritmo.

Prof. Adriano Teixeira de Souza

Page 25: Estrutura de Dados - Ponteiros

Desenvolver 3 programas, cada programa deverá imprimir uma das figuras abaixo

********** ***** ********** ********* **** **** **** ******** *** *** *** ******* ** ** ** ****** * * * ***** * * * **** ** ** ** *** *** *** *** ** **** **** **** * ***** **********

Prof. Adriano Teixeira de Souza


Recommended