estrutura de dados - ponteiros
TRANSCRIPT
![Page 1: Estrutura de Dados - Ponteiros](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/1.jpg)
Prof. Adriano Teixeira de Souza
![Page 2: Estrutura de Dados - Ponteiros](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/2.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/3.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/4.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/5.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/6.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/7.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/8.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/9.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/10.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/11.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/12.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/13.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/14.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/15.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/16.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/17.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/18.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/19.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/20.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/21.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/22.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/23.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/24.jpg)
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](https://reader033.vdocuments.net/reader033/viewer/2022052311/55852582d8b42a4c128b4e9b/html5/thumbnails/25.jpg)
Desenvolver 3 programas, cada programa deverá imprimir uma das figuras abaixo
********** ***** ********** ********* **** **** **** ******** *** *** *** ******* ** ** ** ****** * * * ***** * * * **** ** ** ** *** *** *** *** ** **** **** **** * ***** **********
Prof. Adriano Teixeira de Souza