Upload
nilson-biasotto
View
212
Download
0
Embed Size (px)
Citation preview
8/18/2019 11_Ponteiros
1/45
Ementário
• Noções de hardware e software.• Conceitos Fundamentais.• Vetores, cadeia de caracteres e registros.• Definição e manipulação de arquivos eternos.• !u"programação.
• #locação din$mica de mem%ria. • Estruturas de dados básicas: listas lineares, pilha e
fila. Árvores e grafos.• Métodos de ordenação.• #plicações pr&ticas utili'ando uma linguagem
estruturada de alto n(vel (inguage! "#.• $oç%es de &rogra!ação 'rientada a 'betos co!
a inguage! ")).
8/18/2019 11_Ponteiros
2/45
&*'+*M Á*E -*E
Me!/ria 0ispon1vel no "o!putador
"/digo e2ecutável:3 instruç%es (co!pilador#
3 ar!a4ena!ento do dados (estrutura dos dados#
Me!/ria livre, gerenciada pelo siste!a operacional
8/18/2019 11_Ponteiros
3/45
locação de Me!/ria (567#
• Estática 8 9uantidade total de !e!/ria utili4ada pelos
dados é previa!ente conhecida e definida de!odo i!utável, no pr/prio c/digo3fonte do
progra!a.
8 0urante toda a e2ecução, a uantidade de!e!/ria utili4ada pelo progra!a não varia.
8 ista de variáveis declaradas.
8/18/2019 11_Ponteiros
4/45
locação de Me!/ria (767#
• 0in;!ica 8 9uanto o progra!a é capa4 de criar novas
variáveis enuanto está sendo e2ecutado. 8 locação de !e!/ria para co!ponentes
individuais no instante e! ue eles co!eça! a
e2istir durante a e2ecução do progra!a. 8 malloc: alocar !e!/ria.
8 free: li"erar áreas da !e!/ria ocupadas.
8/18/2019 11_Ponteiros
5/45
locação Estática
2locação 0in;!ica
8/18/2019 11_Ponteiros
6/45
locação Estática (56 5???@# 8 te!po de co!pilação 8 alocados e! !e!/ria de for!a estática
8/18/2019 11_Ponteiros
7/45
locação Estática (76
8/18/2019 11_Ponteiros
8/45
locação Estática (
8/18/2019 11_Ponteiros
9/45
locação 0in;!ica
• i!ple!entação eficiente: ponteiros ou apontadores
• vantagens: 8 ta!anho variável 8 te!po de e2ecução
8 alocados e! !e!/ria de for!a din;!ica• desvantage!, ou restrição: 8 capacidade da !e!/ria, acesso seuencial
8/18/2019 11_Ponteiros
10/45
ariável > endereço de !e!/ria
Área de !e!/ria onde dados são ar!a4enados:• variável estática (lista de variáveis#
8 e2istAncia prevista no c/digo do progra!a(te!po de co!pilação#
8 uantidade de !e!/ria utili4ada pelo progra!anão varia
• variável din;!ica (malloc, free# 8 passa! a e2istir durante a e2ecução do progra!a
8/18/2019 11_Ponteiros
11/45
ariáveis 0in;!icas (ponteiros#
• ponteiros, ou apontadores, ou indicadores,ou referAncias
• variáveis especiais ue ar!a4ena!endereços de !e!/ria, isto é, endereços deoutras variáveis na !e!/ria
• ar!a4ena! u! endereço e não u! valor • e! ", o ponteiro é !ais u! tipo per!itidoco!o ualuer outro
8/18/2019 11_Ponteiros
12/45
Variáveis Ponteiros
&ara declarar u! ponteiro de u! certo tipo, usa3se a seguinte sinta2e:
TipoBase *nome@
Onde:TipoBase é o tipo da infor!ação ue será apontada pelo ponteiro
(infor!a o total de bBtes ocupados pela infor!ação#
o s1!bolo * serve para indicar ue se trata da definição de u! ponteiro
nome corresponde ao no!e da variável ponteiro
8/18/2019 11_Ponteiros
13/45
Definição de Variáveis do Tipo Ponteiro:
1! onteiros ptipos pr&2de'inidos 3$sicos56
int *pt7nt;float *pt8loat;char *ptChar; // definição de string
9! onteiros ptipos de'inidos pelo programador6struct rg8unc {
char nome[40];
char sexo;
float salario;
};
struct rg8unc *pt8unc;
8/18/2019 11_Ponteiros
14/45
Os Operadores de Ponteiros: * e !"#$%
' operador C devolve o endereço na !e!/ria doseu operando. &or e2e!plo:
int x = 10;
int *p = &x;
coloca e! p o endereço da !e!/ria ue conté! avariável . Esse endereço é a posição interna
ao co!putador da variável. ' endereço não te!relação algu!a co! o valor de . ' operador C pode ser i!aginado co!o retornando Do endereço
de, ou sea, D p recebe o endereço de .
8/18/2019 11_Ponteiros
15/45
Os Operadores de Ponteiros: * e !$#$%
' operador F é o co!ple!ento de C, ele devolve o
valor da variável locali4ada no endereço ue o segue.&or e2e!plo, se p conté! o endereço da variável 2,
int x = 10;int *p = &x;int : = *p;
print'3
8/18/2019 11_Ponteiros
16/45
&sando os operadores de ponteiros !* e %
void main35 {
int x, *p; x = 10;
p = &x; print'3
8/18/2019 11_Ponteiros
17/45
8/18/2019 11_Ponteiros
18/45
'epresentação (nterna de Variáveis do TipoPonteiro:
s variáveis din;!icas não são e2plicita!entedeclaradas co!o as estáticas, direta!ente por apelidos ou identificadores.
Hão referenciadas por seus endereços de mem)ria,ar!a4enados e! variáveis (estáticas# especiais
cha!adas de ponteiros ou apontadores.
8/18/2019 11_Ponteiros
19/45
Trabalando com a mem)ria apontada peloponteiro:
&ara trabalhar a !e!/ria ue o ponteiro p está apontando, utili4a3se ooperador *, co! a sinta2e: *p.
$atura!ente p deverá ter u! endereço válido, isto é, p deve estar
apontando para u!a variável ou para u!a !e!/ria de tipoco!pat1vel. &ara tanto, dois outros tipos de atribuiç%es pode! ser feitos co! variáveis do tipo ponteiro:
a% u! ponteiro pode receber o conteIdo de outro ponteiro co!pat1vel(apontar para u! endereço ue contA! u! valor do !es!o tipo#@
b% u! ponteiro pode receber u! endereço especial, cha!ado +&,, (nulo#, ue serve para di4er ue é u! endereço nulo e ue não haverá
nenhu!a variável neste endereço de !e!/ria.
8/18/2019 11_Ponteiros
20/45
-locação Din.mica de /em)ria em 0:
área de !e!/ria ue não é utili4ada por u! progra!a é organi4ada e
gerenciada pelo siste!a operacional, podendo ser alocada através deco!andos padroni4ados oferecidos pela pr/pria linguage! ".
&ara alocar u!a porção da área livre, basta utili4ar o co!ando malloc,sendo p u!a variável ponteiro: p > (int *# malloc(si4eof(int##@ aloca
u!a área de !e!/ria suficiente para ar!a4enar u! nI!ero inteiro eguarda o endereço ocupado e! p, á o co!ando: free(p#@ serve paraliberar a área de !e!/ria cuo endereço está e! p. J!a área de!e!/ria, ue foi alocada pelo co!ando malloc, so!ente volta a ficar
dispon1vel se for e2plicita!ente liberada pelo co!ando free, casocontrário, a liberação da área s/ ocorrerá uando o progra!a ue fe4 aalocação ter!inar de e2ecutar.
&ara co!pletar, p > $J@ !arca p co!o u! endereço nulo. Este
endereço é Itil para di4er ue o ponteiro ainda não te! nenhu!
8/18/2019 11_Ponteiros
21/45
Lixo10
Lixo1FFA
'epresentação (nterna da Variável do TipoPonteiro:void main35 {
int *p;
p = 3int *5 malloc3si.eo'3int55;
*p = 10; !!!
free3p5;} mem-ria usada
pelo programa
p:
endereo
1FFA
mem-ria livreno sistema
aloca a variável estatica!ente
aloca a variável dina!ica!ente
!
Lixo
mem-ria usada
pelo programa
p: mem-ria livreno sistema
8/18/2019 11_Ponteiros
22/45
Entendendo o c)di1o:
int *p;a variável p é u! ponteiro para u! nI!ero inteiro, ou sea, Daponta
para u! endereço de !e!/ria ue será Dalocado para ar!a4enar u!nI!ero inteiro (7 bBtes#
p = 3int *5 malloc3si.eo'3int55;solicita ao siste!a operacional 7 bBtes da !e!/ria livre e o Dendereçodo espaço alocado é colocado na variável ponteiro p
*p = 10;no endereço apontado por p ar!a4ena o nI!ero inteiro 5?
free3p5;libera o espaço de !e!/ria ocupado cuo endereço está e! p (devolve o recurso ao siste!a operacional#
8/18/2019 11_Ponteiros
23/45
Operadores ponto !2% e seta !34%:'s operadores ponto e seta são usados para especificar ele!entos individuais deestruturas (struct# e uni%es. ' operador ponto é usado para especificar direta!ente o
ele!ento e o operador seta para especificar o ele!ento através de u! ponteiro.
>include ?stdio!h@
>include ?string!h@
struct rgessoa A
char nome[B]; char apelido[90];
D;
int main35 A
struct rgessoa pessoa; struct rgessoa * pont"essoa = & pessoa;
strcp:3 pessoa#nome, Emero 8rancisco Fertol5; strcp:3 pessoa#apelido, Chico5;
print'3Gesultado6n5;
print'3Nome!!!6
8/18/2019 11_Ponteiros
24/45
8/18/2019 11_Ponteiros
25/45
Lista ncadeada com !etor '()( * * * AL+CA,-+ .//CA * * *
struct /ipotem { // cada item da lista corresponde a um registro char nome[B0]; // (/ipotem ) composto apenas do campo nome};
void estatica3void5 { fflush3stdin5; const maxTam = 100; // maxTam = tamanho máximo da lista
int n = 0, i; // n = quantidade efetiva de itens na lista
/ipotem lista[maxTam], x; hile 315 { clrscr35;
printf3Hista de nomes 3+locaão *st$tica5n5; for 3i=0; i?n; iII5 printf3
8/18/2019 11_Ponteiros
26/45
,istas Encadeadas com Ponteiros !"#5%
's tipos ponteiros ou apontadores são Iteis para criar estruturas de
dados encadeadas, do tipo listas (pilha e fila#, árvores e grafos. J!apontador é u!a variável ue referencia u!a outra variável alocadadinamicamente. E! geral a variável referenciada é definida co!o u!registro ue inclui ta!bé! u! apontador para outro ele!ento do
!es!o tipo. &or E2e!plo: struct Celula { /ipotem 7tem; Celula *prox;};
Celula *primeiro, *ultimo, *p;
Hendo a variável primeiro u! endereço para u! registro Celula ueconté! o *tem ar!a4enado e o endereço ( pro# da pr/2i!a célula dalista3 é poss1vel criar u!a lista encadeada através de ponteiros.
8/18/2019 11_Ponteiros
27/45
,istas Encadeadas com Ponteiros !$#5%
(tem
Ponteiro ou -pontador
+&,,
0elula
pro6
...7oão /aria -na
primeiro
$a alocação encadeada, os ele!entos são ar!a4enados e! blocos de!e!/ria deno!inados c8lulas, ou nodos, sendo ue cada célula éco!posta por dois ca!pos: u! para ar!a4enar os dados ( *tem# e outro
para ar!a4enar o endereço do pr/2i!o ele!ento da lista ( pro#3 para!anter a relação de orde! linear. Hão endereços especiais da listaencadeada co! ponteiros: a% primeiro: endereço do pri!eiro ele!entoda lista (célula cabeça#, e, b% ultimo: endereço do Ilti!o ele!ento dalista (o endereço do ele!ento nulo ($J# segue o Ilti!o ele!entoda lista.
ultimo
08lula
0abeça
8/18/2019 11_Ponteiros
28/45
,istas Encadeadas !9#5%
Vanta1em de istas Encadeadas co! ponteiros ou apontadores:
3 acilidade de inserir ou remover elementos do meio da lista2 "o!o os ele!entos não precisa! estar ar!a4enados e! posiç%esconsecutivas de !e!/ria, nenhu! dado precisa ser !ovi!entado,
bastando atuali4ar o ca!po de ligação (pro6# do ele!ento ue
precede auele inserido ou re!ovido.
Desvanta1em de istas Encadeadas co! ponteiros ou apontadores:3 -cessar uma posição espec;fica dentro da lista2
"o!o apenas o pri!eiro ele!ento é acess1vel direta!ente através doendereço primeiro, deve3se partir do pri!eiro e ir seguindo os ca!posde ligação (pro6#, u! a u!, até atingir a posição deseada. 'bvia!ente,
para listas e2tensas, esta operação pode ter u! alto custo e! relação a
te!po.
Lista ncadeada com "onteiro '5)5 * * * AL+CA,-+ 6789CA * * *
8/18/2019 11_Ponteiros
29/45
Lista ncadeada com "onteiro '5)5 * * * AL+CA,-+ 6789CA * * *void dinamica3void5 { fflush3stdin5; struct Celula { Tipo7tem 7tem;
Celula *prox; }; Tipo7tem x;
Celula *primeiro, *ultimo, *p;// cria a célula ca#eça
primeiro = 3Celula *5 malloc3si.eo'3Celula55; primeiro$% prox = NLHH; ultimo = primeiro;
hile 315 { clrscr35; print'3Hista de nomes 3+locaão Minmica5n5;
p = primeiro2@prox;
hile 3p K= 7LL5 { print'3
8/18/2019 11_Ponteiros
30/45
"élula especial, ue Dnão ar!a4ena itens, !as ue é usada paraindicar o pri!eiro ele!ento da lista. Obs. uando a lista está va4ia a
Inica célula e2istente é a célula cabeça, portanto, antes de ualuer operação co! a lista deve3se criar a célula cabeça.
Celula *primeiro, *ultimo;!!!
1! primeiro = 3Celula *5 malloc3si.eo'3Celula55;(! primeiro$% prox = NLHH;! ultimo = primeiro;
0riando a 08lula 0abeça da ,ista
+&,,
(tem
0elula
pro6
primeiro ultimo
1
(
8/18/2019 11_Ponteiros
31/45
Entendendo o 0)di1o !"#$%:
primeiro = 3Celula *5 malloc3si.eo'3Celula55;
primeiro$% prox = NLHH;
o operador 34 (seta# é usando para referenciar ele!entos individuais(ou ca!pos# de estruturas (ou registros# apontadas por variávies
ponteiros
indica o valor retornado pela função malloc, ou sea, oendereço do espaço alocado pelo siste!a operacional
para ar!a4enar u!a célula da lista
cha!a a função malloc paraalocar a !e!/ria dina!ica!ente,serão alocados si4eof("elula# bBtes
8/18/2019 11_Ponteiros
32/45
Entendendo o 0)di1o !$#$%:
Celula *primeiro, *ultimo;
as variáveis primeiro e ultimo são ponteiros para u! registro D"elula,ou sea, Daponta! para endereços de !e!/ria ue serão usados paraar!a4enar os itens (ou células# da lista
primeiro = 3Celula *5 malloc3si.eo'3Celula55;
solicita ao siste!a operacional si4eof("elula# bBtes da !e!/rialivre e o Dendereço do espaço alocado é colocado na variável
ponteiro primeiro
primeiro$% prox = NLHH;
no ca!po Dpro2 da célula apontada pelo ponteiro primeiro ar!a4enao endereço $J, ou sea, o endereço de ningué!
ultimo = primeiro;
o ponteiro ultimo aponta para o !es!o endereço ar!a4enado noonteiro rimeiro
8/18/2019 11_Ponteiros
33/45
1! ultimo$% prox = 3Celula *5 malloc3si.eo'3Celula55;(! ultimo = ultimo$% prox;
! ultimo$% 7tem = x;5! ultimo$% prox = 7LL;
0olocando o +ovo (tem no inal da ,ista
+&,,Omero /aria 7uca
(tem
0elula
pro6
primeiro ultimo
pro6
1
+&,,
5
(
-na
6
(tem pro6
-na
8/18/2019 11_Ponteiros
34/45
' algorit!o para percorrer u!a lista do pri!eiro ele!ento até o Ilti!o,se resu!e, na utili4ação de u! apontador au2iliar p ue deve
inicial!ente receber o endereço da pri!eira célula da ista( p = primeiro-> prox;#. seguir, u! processo repetitivo ue fa4 p
pular, através do ca!po de ligação ( prox #, do nodo atual para o nodosucessor ( p = p-> prox;# até ue p passe pelo Ilti!o nodo da lista
(+&,,, o Ilti!o nodo da lista aponta para o va4io#.
*esu!indo e! ter!os de progra!a, o processo para percorrer u!a listaencadeada pode ser descrito co!o segue:
Celula *p;
!!!// endereço da primeira célula da lista
p = primeiro$% prox; hile 3p K= 7LL5 {
print'3
8/18/2019 11_Ponteiros
35/45
' algorit!o para liberar os endereços de !e!/ria alocados na criaçãoda lista deve percorrer, a partir da célula cabeça, todas as células dalista liberando o espaço de !e!/ria ocupado pela célula através dafunção free. &or e2e!plo:
Celula *primeiro, *p;!!!
// endereço da célula ca#eça
p = primeiro;
hile 3p K= 7LL5 {
// endereço do nodo sucessor (prximo) primeiro = primeiro$% prox;
liera a $rea de mem-ria cu/o endereo est$ em p free3p5;
// prxima célula a ser li#erada
p = primeiro;
}
,iberando os Espaços -locados na 0riaçãoda ,ista Encadeada
8/18/2019 11_Ponteiros
36/45
(nserindo uma +ova 08lula na ,ista !"#5%
+&,,-na 0arlos ,uana
0ada u!a cadeia de células (ou nodos#, é necessário e2pandir
esta cadeia co! novos blocos. &ara entender co!o isto podeser feito, basta considerar a situação esue!ati4ada, naLigura abai2o, onde u! nodo de endereço novo deve ser inserido e! u!a ista, ap/s a posição indicada pelo
ponteiro p:p
Danielnovo
(tem
0elula
pro6
primeiro ultimo
8/18/2019 11_Ponteiros
37/45
(nserindo uma +ova 08lula na ,ista !$#5%
+&,,-na 0arlos ,uana
"o!o o novo nodo será inserido logo ap/s auele ue
ar!a4ena o ele!ento GCarlosG, seu sucessor será auelenodo ue ar!a4ena o ele!ento G +uanaG. &ara isto, bastaatuali4ar o ca!po de ligação ( prox # do novo nodo co! oendereço dauele ue guarda o ele!ento G +uanaG.
p
Danielnovonovo-> prox = p-> prox;
(tem
0elula
pro6
primeiro ultimo
8/18/2019 11_Ponteiros
38/45
(nserindo uma +ova 08lula na ,ista !9#5%
+&,,-na 0arlos ,uana
$a pr/2i!a etapa, fa43se o sucessor do nodo apontado por p
(GCarlosG# ser auele apontado por novo (G Daniel G#.
p
Danielnovo
p-> prox = novo;
(tem
0elula
pro6
primeiro ultimo
8/18/2019 11_Ponteiros
39/45
(nserindo uma +ova 08lula na ,ista !5#5%
+&,,-na 0arlos
*esu!indo e! ter!os de progra!a, o processo de inserção pode ser
descrito co!o segue:1! novo$% prox = p$% prox;(! p$% prox = novo;
p
Danielnovo 1
(
(tem
0elula
pro6
primeiro ultimo
,uana
8/18/2019 11_Ponteiros
40/45
'emovendo uma 08lula da ,ista !"#
8/18/2019 11_Ponteiros
41/45
'emovendo uma 08lula da ,ista !$# prox;
(tem
0elula
pro6
ultimo
+&,,
primeiro
8/18/2019 11_Ponteiros
42/45
'emovendo uma 08lula da ,ista !9#
8/18/2019 11_Ponteiros
43/45
'emovendo uma 08lula da ,ista !5#
8/18/2019 11_Ponteiros
44/45
'emovendo uma 08lula da ,ista !
8/18/2019 11_Ponteiros
45/45
*eferAncias (&onteiros e! &ascal#
• Estrutura de 0ados Lunda!entais: conceitos eaplicaç%es.
8 Hilvio do ago &ereira. 8 7 M ed. 3 Hão &aulo: Nrica, 5OOP.
• -nstituto de "o!putação da J$-"M&
8 Llávio Q. MiBa4aRa C =o!as4 QoRaltoRsSi 8 http:66oli!piada.ic.unica!p.br6apostila.ht!l
http://olimpiada.ic.unicamp.br/apostila.htmlhttp://olimpiada.ic.unicamp.br/apostila.html