Você está na página 1de 7

06/07/13

Linguagem C - Ponteiros

[ Voltar ] [ ndice ] [ Avanar ]

13. Ponteiros 13.1 Exibindo o endereo de memria de uma varivel


Para exibir o endereo de memria de uma varivel use o operador & antes da varivel. Lembre-se que o valor da varivel uma coisa e o endereo de memria onde este valor est armazenado outra. O cdigo abaixo esclarecer melhor estes conceitos:
/ *e x i b i n d ooe n d e r e od em e m r i ad ev a r i v e i s* / # i n c l u d e< s t d i o . h > i n tm a i n ( ) { c h a rl e t r a=' s ' ; i n ti d a d e=3 5 ; c h a rn o m e [ 1 0 ]=" s a m u e l " ; f l o a tp e s o=8 7 . 8 ; f l o a ta l t u r a=1 . 8 2 ; p r i n t f ( " E x i b i n d ooe n d e r e od em e m r i ad ev a r i v e i s \ n \ n " ) ; p r i n t f ( " Ov a l o rd av a r i v e ll e t r a% ces e ue n d e r e o% x \ n " , l e t r a , & l e t r a ) ; p r i n t f ( " Ov a l o rd av a r i v e li d a d e% des e ue n d e r e o% x \ n " , i d a d e , & i d a d e ) ; p r i n t f ( " Ov a l o rd av a r i v e ln o m e% ses e ue n d e r e o% x \ n " , n o m e , n o m e ) ; p r i n t f ( " Ov a l o rd av a r i v e lp e s o% 2 . 1 fes e ue n d e r e o% x \ n " , p e s o , & p e s o ) ; p r i n t f ( " Ov a l o rd av a r i v e la l t u r a% 1 . 2 fes e ue n d e r e o% x \ n " , a l t u r a , & a l t u r a ) ; }

Ao ser executado, o cdigo acima dever exibir algo parecido com:


E x i b i n d ooe n d e r e od em e m r i ad ev a r i v e i s Ov a l o rd av a r i v e ll e t r ases e ue n d e r e ob f f f f 8 c b Ov a l o rd av a r i v e li d a d e3 5es e ue n d e r e ob f f f f 8 c 4 Ov a l o rd av a r i v e ln o m es a m u e les e ue n d e r e ob f f f f 8 b 8 Ov a l o rd av a r i v e lp e s o8 7 . 8es e ue n d e r e ob f f f f 8 b 4 Ov a l o rd av a r i v e la l t u r a1 . 8 2es e ue n d e r e ob f f f f 8 b 0

Observe na codificao que a varivel n o m eno precisou do operador de endereo & pois matrizes j so tratadas como ponteiros pela linguagem C. Assim, quando o programa passa uma matriz para uma funo, o compilador passa o endereo inicial da matriz.

13.2 Definio de ponteiros


Depois de entendida a diferena entre o valor de uma varivel e seu endereo de memria fica fcil definir ponteiros. Ponteiro uma varivel que armazena um endereo de memria. OBSERVAO:Cabe aqui ressaltar que a linguagem C trata as matrizes como ponteiros, assim quando seu programa passa uma matriz para uma funo, o compilador na verdade passa o endereo do primeiro elemento da matriz. Observe o exemplo abaixo:
/ *v e r i f i c a n d oc o m oCt r a t aa sm a t r i z e sc o m op o n t e i r o s* / # i n c l u d e< s t d i o . h > i n tm a i n ( ) {
homepages.dcc.ufmg.br/~joaoreis/Site de tutoriais/c_int/ponteiros.htm 1/7

06/07/13

Linguagem C - Ponteiros

i n ti d a d e [ 5 ] ; f l o a tp e s o [ 5 ] ; c h a rn o m e [ 1 0 ]=" s a m u e l " ; p r i n t f ( " Oe n d e r e od op r i m e i r oe l e m e n t od am a t r i zi d a d e% x \ n " , i d a d e ) ; p r i n t f ( " Oe n d e r e od op r i m e i r oe l e m e n t od am a t r i zp e s o% x \ n " , p e s o ) ; p r i n t f ( " Oe n d e r e od op r i m e i r oe l e m e n t od am a t r i zn o m e% x \ n " , n o m e ) ; r e t u r n ( 0 ) ; }

13.3 Declarando uma varivel ponteiro


A sintaxe para a declarao de uma varivel ponteiro :
T I P O* N O M E

onde T I P O um tipo de dados vlido e N O M E o nome da varivel. Exemplo:


i n t* i d a d e ;

13.4 Atribuindo valor a uma varivel ponteiro


Como o ponteiro uma varivel que armazena um endereo de memria, voc dever atribuir a uma varivel ponteiro um endereo de memria. Exemplo:
/ *a t r i b u i n d ov a l o rau m av a r i v e lp o n t e i r o* / # i n c l u d e< s t d i o . h > i n tm a i n ( ) { i n ti d a d e=3 5 ; i n t* p t r _ i d a d e ; p t r _ i d a d e=& i d a d e ;/ *f o ia t r i b u d ooe n d e r e od av a r i v e l i d a d eav a r i v e lp o n t e i r op t r _ i d a d e . O b s e r v eou s od oo p e r a d o r&q u ed e v o l v e oe n d e r e od em e m r i ad av a r i v e l i d a d e .* / p r i n t f ( " Ov a l o rd av a r i v e li d a d e% d \ n " , i d a d e ) ; p r i n t f ( " Oe n d e r e od av a r i v e li d a d e% x \ n " , & i d a d e ) ; p r i n t f ( " Ov a l o rd av a r i v e lp o n t e i r op t r _ i d a d e% x \ n " , p t r _ i d a d e ) ; r e t u r n ( 0 ) ; }

13.5 Desreferenciando um ponteiro


Um ponteiro armazena um endereo de memria. Desreferenciar um ponteiro acessar o valor armazenado neste endereo. Para isso voc deve usar o operador de indireo, que o asterisco * . Exemplo:
/ *d e s r e f e r e n c i a n d ou mp o n t e i r o* / # i n c l u d e< s t d i o . h > i n tm a i n ( ) { i n ti d a d e=3 5 ; i n t* p t r _ i d a d e ; p t r _ i d a d e=& i d a d e ;/ *f o ia t r i b u d ooe n d e r e od av a r i v e l i d a d eav a r i v e lp o n t e i r op t r _ i d a d e .
homepages.dcc.ufmg.br/~joaoreis/Site de tutoriais/c_int/ponteiros.htm 2/7

06/07/13

Linguagem C - Ponteiros

O b s e r v eou s od oo p e r a d o r&q u ed e v o l v e oe n d e r e od em e m r i ad av a r i v e l i d a d e .* / p r i n t f ( " Ov a l o rd av a r i v e li d a d e% d \ n " , i d a d e ) ; p r i n t f ( " Oe n d e r e od av a r i v e li d a d e% x \ n " , & i d a d e ) ; p r i n t f ( " Ov a l o rd av a r i v e lp o n t e i r op t r _ i d a d e% x \ n " , p t r _ i d a d e ) ; p r i n t f ( " Ov a l o ra p o n t a d op o rp t r _ i d a d e% d \ n " , * p t r _ i d a d e ) ; / *o b s e r v e ,n al i n h aa c i m a ,ou s od oo p e r a d o rd ei n d i r e o(*) *p a r ad e s r e f e r e n c i a rop o n t e i r op t r _ i d a d ee ,a s s i m ,e x i b i r *ov a l o ra r m a z e n a d on oe n d e r e od em e m r i aa p o n t a d op o re l e .* / r e t u r n ( 0 ) ; }

13.6 Alterando o valor armazenado no endereo apontado por um ponteiro


/ *A l t e r a n d oov a l o ra r m a z e n a d on oe n d e r e oa p o n t a d o *p o ru mp o n t e i r o * / # i n c l u d e< s t d i o . h > i n tm a i n ( ) { i n tn u m e r o=3 5 ; i n t* p t r ; p t r=/ *a t r i b u i n d ooe n d e r e od en u m e r oap t r* / p r i n t f ( " Op o n t e i r op t ra r m a z e n aoe n d e r e o% xq u e , \ n p o rs u av e z , \ a r m a z e n aov a l o r% d \ n " , p t r , * p t r ) ; * p t r=2 5 ;/ *a l t e r a n d oov a l o ra r m a z e n a d on oe n d e r e o *a p o n t a d op o rp t r .O b s e r v eq u eop o n t e i r o *d e v es e rd e s r e f e r e n c i a d o . * / p r i n t f ( " \ n A g o r aop o n t e i r op t ra r m a z e n aoe n d e r e o% xq u e , \ n p o rs u av e z , \ a r m a z e n aov a l o r% d \ n " , p t r , * p t r ) ; r e t u r n ( 0 ) ; }

13.7 Ponteiros como parmetros de funo


Quando queremos alterar o valor dos argumentos passados para uma funo devemos definir os parmetros da funo como ponteiros. A isso denominamos chamada por referncia. Exemplo:
/ *p o n t e i r o sc o m op a r m t e r o sd ef u n o* / # i n c l u d e< s t d i o . h > / *af u n oq u er e c e b ec o m oa r g u m e n t oov a l o r *d av a r i v e ln oc o n s e g u ea l t e r a rov a l o r *d e s t e * / i n tv a l o r ( i n ta ) { a=3 5 ;/ *a l t e r a n d oov a l o rd oa r g u m e n t op a s s a d o* / } / *af u n oq u er e c e b ec o m oa r g u m e n t ou mp o n t e i r o *c o n s e g u ea l t e r a rov a l o ra p o n t a d op o re s t e * /
homepages.dcc.ufmg.br/~joaoreis/Site de tutoriais/c_int/ponteiros.htm 3/7

06/07/13

Linguagem C - Ponteiros

i n tp o n t e i r o ( i n t* a ) { * a =3 5 ;/ *a l t e r a n d oov a l o rd oa r g u m e n t op a s s a d o* / }

i n tm a i n ( ) { i n tn r=2 6 ; i n t* p t r _ n r ; p r i n t f ( " Ov a l o ri n i c i a ld en r% d \ n " , n r ) ; v a l o r ( n r ) ;/ *f u n oq u er e c e b eov a l o r .N oc o n s e g u ea l t e r a re s t e* / p r i n t f ( " V a l o rd en ra p sac h a m a d ad af u n ov a l o r=% d \ n " , n r ) ; p t r _ n r=& n r ; p o n t e i r o ( p t r _ n r ) ;/ *f u n oq u er e c e b ep o n t e i r o .C o n s e g u ea l t e r a rv a l o r *a p o n t a d o * / p r i n t f ( " V a l o rd en ra p sac h a m a d ad af u n op o n t e i r o=% d \ n " , n r ) ; r e t u r n ( 0 ) ; }

13.8 Aritmtica dos ponteiros


Voc pode somar e subtrair valores a ponteiros, porm deve estar atento a um detalhe. Os ponteiros so endereos de memria, assim ao somar 1 a um ponteiro voc estar indo para o prximo endereo de memria do tipo de dado especificado. Por exemplo, digamos que um ponteiro do tipo char aponta para o endereo 1000. Se voc somar 2 a este ponteiro o resultado ser um ponteiro apontando para o endereo 1002, pois o tipo char requer um byte de memria para armazenar seus dados. Se este ponteiro fosse do tipo int o resultado seria um ponteiro apontando para o endereo 1008, pois o tipo int, sob o linux, requer quatro bytes para armazenar seus dados. Ento, sempre que for somar ou subtrair aos ponteiros voc tem que trabalhar com o tamanho do tipo de dado utilizado. Para isso voc pode usar o operador sizeof. Analise o cdigo abaixo para um melhor entendimento deste conceito:
/ *v i s u a l i z a n d oc o m of u n c i o n aaa r i t m t i c ad ep o n t e i r o s* / # i n c l u d e< s t d i o . h > i n tm a i n ( ) { c h a rl e t r a [ 5 ]={ ' a ' , ' e ' , ' i ' , ' o ' , ' u ' } ; i n tc o n t a d o r ,n r [ 5 ]={ 3 0 , 1 2 , 6 7 , 1 3 , 4 1 } ; c h a r* p t r _ l e t r a ; i n t* p t r _ n r ; p t r _ l e t r a=l e t r a ; p t r _ n r=n r ; p r i n t f ( " V i s u a l i z a n d oc o m of u n c i o n aaa r i t m t i c ad ep o n t e i r o s \ n " ) ; p r i n t f ( " \ n m a t r i zl e t r a=a ,e ,i ,o ,u \ n " ) ; p r i n t f ( " m a t r i zn r=3 0 , 1 2 , 6 7 , 1 3 , 4 1 \ n " ) ; p r i n t f ( " \ n V e r i f i c a n d oot a m a n h od o st i p o sd ed a d o s \ n " ) ; p r i n t f ( " t a m a n h od ot i p od ed a d oc h a r =% d \ n " , s i z e o f ( c h a r ) ) ; p r i n t f ( " t a m a n h od ot i p od ed a d oi n t =% d \ n " , s i z e o f ( i n t ) ) ; p r i n t f ( " \ n P o n t e i r op a r al e t r aa p o n t ap a r a% cn oe n d e r e o% x \ n " , * p t r _ l e t r a , p t r _ l e t r a ) ; p r i n t f ( " P o n t e i r op a r an ra p o n t ap a r a% dn oe n d e r e o% x \ n " , * p t r _ n r , p t r _ n r ) ; p r i n t f ( " \ n I n c r e m e n t a n d oo sp o n t e i r o s \ n " ) ; p r i n t f ( " p t r _ l e t r a+3 ,p t r _ n r+2 \ n " ) ;
homepages.dcc.ufmg.br/~joaoreis/Site de tutoriais/c_int/ponteiros.htm 4/7

06/07/13

Linguagem C - Ponteiros

p t r _ l e t r a+ =3 ; p t r _ n r+ =2 ; p r i n t f ( " \ n P o n t e i r op a r al e t r aa g o r aa p o n t ap a r a% cn oe n d e r e o% x \ n " , * p t r _ l e t r a , p t r _ l e t r a ) ; p r i n t f ( " P o n t e i r op a r an ra g o r aa p o n t ap a r a% dn oe n d e r e o% x \ n " , * p t r _ n r , p t r _ n r ) ; r e t u r n ( 0 ) ; }

13.9 Exibindo uma string usando um ponteiro


Uma string uma matriz de caracteres. Podemos usar um ponteiro para exib-la assim:
/ *e x i b i n d ou m as t r i n gu s a n d ou mp o n t e i r o* / # i n c l u d e< s t d i o . h > i n tm a i n ( ) { c h a rs t r i n g [ 4 0 ]=" E x i b i n d ou m as t r i n gu s a n d ou mp o n t e i r o . " ; c h a r* p t r _ s t r ; / *A p o n t a n d op a r aas t r i n g* / p t r _ s t r=s t r i n g ; p r i n t f ( " A p o n t a n d op a r aoi n i c i od as t r i n g= >p t r _ s t r=% c \ n \ n " , * p t r _ s t r ) ; / *E x i b i n d ot o d aas t r i n gu s a n d oop o n t e i r o* / w h i l e ( * p t r _ s t r ) { p u t c h a r ( * p t r _ s t r ) ; p t r _ s t r + + ; } p r i n t f ( " \ n " ) ; r e t u r n ( 0 ) ; }

13.10 Criando uma funo que retorna um ponteiro


# i n c l u d e< s t d i o . h > # i n c l u d e< c t y p e . h > / *F u n oq u ec o n v e r t eu m as t r i gp a r am a i s c u l a s . *E s t af u n or e t o r n au mp o n t e i r o * / c h a r* c o n v e r t e _ m a i u s c u l a ( c h a r* s t r i n g ) { c h a r* i n i c i o _ d a _ s t r ,* a u x i l i a r ; i n i c i o _ d a _ s t r=a u x i l i a r=s t r i n g ; w h i l e ( * s t r i n g ) { * a u x i l i a r=t o u p p e r ( * s t r i n g ) ; s t r i n g + + ; a u x i l i a r + + ; } r e t u r n ( i n i c i o _ d a _ s t r ) ; }

i n tm a i n ( ) { c h a rs t r i n g [ 8 0 ]=" U s a n d ou m af u n oq u er e t o r n au m as t r i n g . " ; p r i n t f ( " % s \ n " , s t r i n g ) ; c o n v e r t e _ m a i u s c u l a ( s t r i n g ) ;


homepages.dcc.ufmg.br/~joaoreis/Site de tutoriais/c_int/ponteiros.htm 5/7

06/07/13

Linguagem C - Ponteiros

p r i n t f ( " % s \ n " , s t r i n g ) ; r e t u r n ( 0 ) ; }

13.11 Matriz de ponteiros/strings


A linguagem C lhe permite criar matrizes de ponteiros. O uso mais comum para este tipo de matriz conter strings. Abaixo segue um exemplo da declarao de uma matriz que armazena ponteiros para strings:
c h a r* d i a s ( 7 )={ " D o m i n g o " , " S e g u n d a " , " T e r a " , " Q u a r t a " , " Q u i n t a " , " S e x t a " , " S b a d o " } ;

OBSERVAO:Em matrizes de ponteiros para strings a linguagem C no inclui um item N U L L para indicar o final da matriz, voc tem que fazer isso.

13.12 Percorrendo uma matriz de strings com um lao for


/ *p e r c o r r e n d ou m am a t r i zd es t r i n g sc o mu ml a of o r* / # i n c l u d e< s t d i o . h > i n tm a i n ( ) { c h a r* d i a s [ 7 ]={ " D o m i n g o " , " S e g u n d a " , " T e r a " , " Q u a r t a " , " Q u i n t a " , " S e x t a " , " S b a d o " } ; i n tc o n t a d o r ; f o r ( c o n t a d o r=0 ; c o n t a d o r<7 ; c o n t a d o r + + ) p r i n t f ( " % d od i ad as e m a n a=% s \ n " , c o n t a d o r + 1 , d i a s [ c o n t a d o r ] ) ; r e t u r n ( 0 ) ; }

13.13 Percorrendo uma matriz de strings com um ponteiro


/ *p e r c o r r e n d ou m am a t r i zd es t r i n g sc o mu mp o n t e i r o* / # i n c l u d e< s t d i o . h > i n tm a i n ( ) { c h a r* d i a [ ]={ " D o m i n g o " , " S e g u n d a " , " T e r a " , " Q u a r t a " , " Q u i n t a " , " S e x t a " , " S b a d o " , 0 } ; c h a r* * p t r _ d i a ; / ** d i au mp o n t e i r op a r au m as t r i n ge ** * p t r _ d i au mp o n t e i r op a r au mp o n t e i r op a r au m as t r i n g * / p t r _ d i a=d i a ;/ *a p o n t a n d op t r _ d i ap a r aoi n c i od am a t r i zd i a* / w h i l e ( * p t r _ d i a ) { p r i n t f ( " % s \ n " , * p t r _ d i a ) ; p t r _ d i a + + ; } r e t u r n ( 0 ) ; } / *Q u a n d ov o c d e c l a r au m am a t r i zd es t r i n g soc o m p i l a d o r *n oa c r e s c e n t au mc a r a c t e r eN U L Lp a r ai n d i c a rof i n a l *d am a t r i zc o m oof a zc o mu m am a t r i zd ec a r a c t e r e s( s t r i n g s ) . *P o ri s s ov o c m e s m ot e mq u ei n s e r i roc a r a c t e r eN U L Lp a r a *i n d i c a rof i n a ld am a t r i z .
homepages.dcc.ufmg.br/~joaoreis/Site de tutoriais/c_int/ponteiros.htm 6/7

06/07/13

Linguagem C - Ponteiros

* *F o ii s s oq u ef o if e i t oa oi n s e r i r0n of i n a ld am a t r i zd i a * /

13.14 Ponteiro para funo


Voc pode criar um ponteiro para uma funo. O uso mais comum deste recurso para passar uma funo como parmetro para outra funo. A declarao de um ponteiro para uma funo segue a sintaxe:
T I P O( * F U N O ) ( ) ;

Observe o uso disto no exemplo abaixo:


/ *e x e m p l i f i c a n d oou s od ep o n t e i r op a r au m af u n o* / # i n c l u d e< s t d i o . h > / *f u n oq u ei d e n t i f i c aom a i o re n t r ed o i si n t e i r o s* / i n tm a i o r ( i n tn r 1 , i n tn r 2 ) { r e t u r n ( ( n r 1>n r 2 )?n r 1:n r 2 ) ; } / *f u n ou s a _ m a i o r ( ) .R e c e b ed o i si n t e i r o seu m *p o n t e i r op a r aaf u n om a i o r ( ) * / i n tu s a _ m a i o r ( i n tx , i n ty ,i n t( * m a i o r ) ( ) ) { r e t u r n ( m a i o r ( x , y ) ) ; } i n tm a i n ( ) { i n ta , b ; p r i n t f ( " E n t r ec o mop r i m e i r on m e r o :" ) ; s c a n f ( " % d " , & a ) ; p r i n t f ( " E n t r ec o mos e g u n d on m e r o :" ) ; s c a n f ( " % d " , & b ) ; p r i n t f ( " Om a i o re n t r eo sd o i s% d \ n " , u s a _ m a i o r ( a , b , & m a i o r ) ) ; / *o b s e r v el o g oa c i m aq u eu s a _ m a i o r ( )r e c e b ec o m oa r g u m e n t o s *d o i sn m e r o si n t e i r o seoe n d e r e od af u n om a i o r ( ) *s e n d o ,a s s i m ,c o e r e n t ec o ms u ad e c l a r a o * / r e t u r n ( 0 ) ; }

[ Voltar ] [ ndice ] [ Avanar ]

homepages.dcc.ufmg.br/~joaoreis/Site de tutoriais/c_int/ponteiros.htm

7/7