Академический Документы
Профессиональный Документы
Культура Документы
Tecnologiaedesenvolvimento.net
C++101Parte4Ponteiros (conceitosbsicos)
Olpessoal,tudocerto?! DepoisdeumadiscussoboasobreaestticadoC++notwitter,resolvivoltaraabordarotemaaqui noblog.Talvezvocaindanosaiba,mascomeceiumasrieintrodutriaparaC++halgumtempo. Nopostdehoje,pretendointroduzirumtematraumticoparaquemutilizaC++:ponteiros.
Oqueumponteiro?
Cadaposiodememriaqueusamosparaarmazenarumvalorpossuiumendereo. Umponteiroumavarivelquearmazenaumendereoemmemriaquecontmdadosdeum determinadotipo. Umponteirotemumnomedevariveletambmtemumtipoqueidentificaquetipodedadoest armazenadonoendereoquepossui. Umponteiroquearmazeneoendereodememriaondeestarmazenadoumdadointeiro,porexemplo, conhecidocomoponteiroparauminteiro.
Declarandoumponteiro
Adeclaraoparaumponteiroparecidacomaquelaqueestamoshabituadosafazerparavariveis comuns,excetoqueonomedoponteirodeveserprefixadocomumasterisco.Considere:
1 #nldisra> icue<otem 2
3 4 5 6 7 8
OoperadorAddressOf
Jsabemosqueponteirossoutilizadosparaarmazenarendereosemmemriadosnossosdados. Ento,comofazemosparaobteroendereodememriacorrespondentesaosdadosarmazenadosem umavarivel?Simples,usamosooperadoraddressof(&).Observe:
0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 1 0 #nldisra> icue<otem itmi( nan) { itnme0 nubr=1 itnme n*pubr pubr=&ubr nmenme rtr eun0 }
Usandooponteiro
Jsabemoscomoobteroendereodeumavarivel.Tambmjsabemoscomoarmazenaresseendereo emumponteiro.Agora,vamosvercomoacessarovalorqueestnaposiodoponteiro,paraisso, usamosooperadordeindireo(*).
Observe:
0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 #nldisra> icue<otem itmi( nan) { itnme0 nubr=1 itnme n*pubr pubr=&ubr nmenme sd:ot<VleOubrvral:"<ubr<t:ed t:cu<"aufnmeaibe<nme<sd:nl <AdesOubrvral:"<nme<sd:nl <"drsfnmeaibe<pubr<t:ed <VleOnmeaibe:"<nme<sd:nl <"aufpubrvral<pubr<t:ed <VleOnmeone:"<pubr<t:ed <"aufpubrpitr<*nme<sd:nl rtr eun0 }
Executando(naminhamquina):
Lindo! Entendaqueoponteiroestapontandoparaovalordavarivel.Repare:
0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 1 0 1 1 1 2 1 3 1 4 #nldisra> icue<otem itmi( nan) { itnme0 nubr=1 itnme n*pubr pubr=&ubr nmenme *nme1 pubr=1 sd:ot<VleOubrvral:"<ubr<t:ed t:cu<"aufnmeaibe<nme<sd:nl rtr eun0 }
Essecdigoalteraovalordenumberatravsdoponteiro.
Porqueusarponteiros?
SevocnovoemC++,talvezestejaseperguntandooporquusarponteiros?Vamosaalgumas justificativas: comovocveremseguida,podemosutilizaranotaodeponteirosparamanipulararrays,oque frequentementemaisrpido ponteirosfacilitamoacessoagrandesporesdedados ponteirospermitemaalocaodinmicadememria sevocvemdeC#,ponteirossoosdelegatesdoC++.
Inicializandoponteiros
Utilizarponteirosquenoforaminicializadosextremamenteperigoso.Semquerer,podemos sobrescreverdadosemreasaleatriasdememria. Jsabemoscomoinicializarumponteiroparaapontarparaoendereodeumavarivel. Outraboaprticaseriainicializarumponteiroatribuirnullptrqueseriaoequivalenteasem endereo.Observe:
0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 1 0 1 1 1 2 1 3 1 4 1 5 #nldisra> icue<otem itmi( nan) { it*1 np it*2nlpr np(ult) ip=nlpr f(1=ult) sd:ot<posntpitoayhn"<t:ed t:cu<"1deoonstntig<sd:nl ip=nlpr f(2=ult) sd:ot<posntpitoayhn"<sd:nl t:cu<"2deoonstntig<t:ed rtr eun0 }
AexecuodessecdigodeixaevidentequenullptrNOovalordefault
Entendido?!
Usandodeslocamentoscomumponteiro
Ponteirosnospermitemnavegarfacilmenteatravsdevetores.Considere:
0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 1 0 #nldisra> icue<otem itmi( nan) { ca*nmEear hrae="lmrJ" iti=0 n wie(aei='0) hlnm[]!\' sd:ot<aei+<sd:nl t:cu<nm[+]<t:ed }
0 7 0 8 0 9 1 0
Porhoje,eraisso.
6CommentsonC++101Parte4Ponteiros (conceitosbsicos)
1. BrenoFerreira 22/09/2011
0 0 i RateThis
ExcelenteartigoElemar.Sachoquevocedisseumaanalogiameioerrada(aomeuver): sevocvemdeC#,ponteirossoosdelegatesdoC++. Peloqueeusaiba,delegatessofunctionpointers,enoponteirossimples.Issopodeconfundira galeraquelerseupost.Achoqueumaanalogiamelhorseriafalarqueponteirossoamesmacoisa quandosepassavaloresutilizandoakeywordrefouout. Abraos Breno Comentar elemarjr 22/09/2011
0 0 i RateThis ScompletandooqueoElemardisse,refeoutsoumadaskeywordsquetemrelaoa
ponteiros. Considere: MinhaClasseminhaClasse=newMinhaClasse(Alberto) Console.WriteLine(minhaClasse.Nome) MinhaClasseoutraClasse=minhaClasse outraClasse.Nome=Breno Console.WriteLine(minhaClasse.Nome) Resultado Alberto Breno Comopodemosver,nessecdigoaialteramosvariveisdiferentes,masqueapontavamparao mesmoendereodememoria(ponteiroslindo)! Aanalogiaquecheguemaispertocreioquesejafalardosobjetosdosquaisficamarmazenados naHEAP Comentar 2. AriC.Raimundo(@acraimundo) 23/09/2011