Sunteți pe pagina 1din 9

ElemarDEV

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

itmi( nan) { it*nme1 npubr itnme2 n*pubr rtr eun0 }

Opequenoprogramaacimadeclaradoisponteiros.Reparequenohdiferenaentremanteroastersco pertodonomedavariveloudotipo.Qualquerformaquevocescolha,seraceitapelocompilador. comumencontrarmosponteirosnomeadoscomeandocomump.

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 }

Oqueessepequenocdigofazcriarumavariveldotipointeiro,comovalor10.Logodepois, atribumosoendereodessavarivelemnossoponteiro. Podemosutilizarooperadoraddressofparaobteroendereodequalquervarivel(dequalquer tipo).Entretanto,devemossempretomarocuidadodeutilizarotipoapropriadodeponteiro. Porexemplo,sedesejamosarmazenaroendereodeumavariveldotipodouble,devemosutilizarum ponteiroparadouble(double*).

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 }

Oquegostariadeobservar: 1. quandoiniciamosumponteiroparachar(char*)apontandoparaumastring,estamos,defato, criandoumpequenoarraydecharsqueencerradopelocaracterenulo() 2. Quandousamosumponteiro,podemosavanarposiesdememriautilizandoumdeslocamento (semelhanteaarray). Outraversoparaomesmocdigo:


0 1 0 2 0 3 0 4 0 5 0 6 #nldisra> icue<otem itmi( nan) { ca*nmEear hrae="lmrJ" iti=0 n

0 7 0 8 0 9 1 0

wie(nm='0) hl*ae!\' sd:ot<(ae+<sd:nl t:cu<*nm+)<t:ed }

Oqueestoufazendo?!Nolugardeusarumdeslocamento,estouindicandoquedesejoavanarparaa prximaposiodememria,compatvelcomotipo.Paraisso,useiaritmticadeponteiros. Entretanto,essetemaparaoutropost.

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 Breno, Obrigadopelofeedback. Mereferiaponteirosdefunonaanalogiaparaosdelegates.Hmuitomaisemponteirosque qualqueranalogiacomC#consigaexplicar. Esperoqueosleitoresconsigamfazeradistino. Comentar AlbertoMonteiro 23/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

0 0 i RateThis Elemar, Sugiroqueemfuturostpicosmaisavanadosdasriesejaabordadotambminformaessobreo C++modernoeconceitoscomosmartpointers,lambdaseoutros. Abraos. Comentar elemarjr 23/09/2011

0 0 i RateThis Obrigadopeladica.Chegaremosl. Comentar 3. Pingback:C++101Parte11StructuresElemarDEV Publicados22/09/2011porelemarjremSemcategoriaemarcadoC++,C++101. http://wp.me/pZuNgnt Postanterior Postseguinte BlognoWordPress.com.Tema:SuburbiaporWPSHOWER.

S-ar putea să vă placă și