soh um detalhezinho bem chato. :o/
(soh pra poderem dizer que sou maleta)
nao se esquecam que a resposta abaixo eh C++, oq em alguns compiladores
pode dar problemas
agora um tutorial rapido sobre var *var &var
var -> acesso ao conteudo da variavel
se a variavel eh do tipo int, vc vai pegar o interiro que foi atribuido a
ela
por ex.: x=5; printf("%d", x); imprime 5 na tela
&var -> endereco da variavel na memoria.
esse endereco eh muito relativo. Saber exatamente o valor do endereco nao
tem muita utilidade, vc pode estar dentro de um segmento, ou dentro de uma
maquina virtual, ou n outras coisas. Esse valor soh eh importante se vc
estah mechendo com assembly puro ou com embedded tech, e ainda olhe lah.
portanto se vc tem um ponteiro chamado b. se vc fizer b=&x; printf("%d",
&b); vc vai conseguir um valor completamente escroto que eh o endereco de
acesso a variavel b. Ou seja, o conteudo da variavel b (que eh o endereco da
vriavel x) vai estar armazenado nesse endereco, e se vc fizer printf("%d",
b); vc vai estar imprimindo outro valor escroto, que eh o endereco de acesso
a variavel x (nos armazenamos o endereco de x em b - b=&x)
*var -> conteudo apontado pela variavel
aih eh que comeca a esquentar. qdo vc faz um ponteiro apontar pra uma
variavel com esse comando vc pode acessar o conteudo da variavel.
Continuando nosso exemplo printf("%d", *b); vai nos imprimir 5 na tela...
isso mm, e se fizermos y=10; b=&y; printf("%d", *b) vai ser impresso o valor
10 na tela... olha que legal, o mm comando gerou, as mm variaveis geraram
valores diferentes, imagine vc fazendo isso num loop, legal, neh?
agora, se fizermos printf("%d", *x); aih vc tah correndo risco, se for um
sistema operacional com protecao de memoria (como win32 ou linux) vc pode
estar gerando uma falha de protecao e se isso acontecer teu programa vai ser
fechado. Pq? pq aih vc vai estar acessando o endreco 5 da memoria (seja
segmento, ou maquina virtual, ou endereco fisico). E se isso estiver
protegido pra leitura, sinto muito, teu programa ja era. :o)
muito cuidado com ponteiros. A maioria absoluta dos erros de 'core dump'
eh por causa de erros como esse que eu sitei acima.
entedemos tudo?
;o)
mazza.
----- Original Message -----
From: Rodrigo Alexandre Ribeiro Canellas <[EMAIL PROTECTED]>
To: listas-Linux-BR <[EMAIL PROTECTED]>
Sent: Wednesday, October 03, 2001 2:28 PM
Subject: Re: (linux-br) [ zgrp ] Ponteiros em C
adotando o seguinte modelo:
int *v = 0;
temos:
|++++|
v |_k0_|_#__|
aqui, 'v' � uma vari�vel que mora no endere�o de mem�ria 'k0' e cujo
conte�do iniical � o endere�o de mem�ria 'NULL', que significa um endere�o
de mem�ria inv�lido (simbolicamente '#')
quando se faz, p.ex.,
v = new int (-12);
temos:
|++++| |+++++|
v |_k0_|_k1_| |_k1_|_-12_|
agora, o conte�do de 'v' � o endere�o de mem�ria 'k0', e no endere�o de
mem�ria 'k0' est� o conte�do '-12'
e qdo se faz:
int i = *v;
temos:
|++++| |+++++|
v |_k0_|_k1_| |_k1_|_-12_|
|++++|
i |_k3_|_-12|
ou seja, 'i' � uma vari�vel que mora no endere�o de mem�ria 'k3' e cujo
conte�do � '-12', valor este acessado pelo operador '*' aplicado a vari�vel
'v', i.e., '*v' acessa o conte�do do endere�o de mem�ria que � o conte�do de
'v'
e, como no seu exemplo, vc faz:
int *v = 0;
int x = -4;
temos:
|++++|
v |_k0_|_#__|
|++++|
x |_k2_|_-3_|
ou seja, 'x' � uma vari�vel, e como tal mora no endere�o 'k2' e seu conte�do
� um inteiro
e em seguida:
v = &x;
temos:
|++++|
v |_k0_|_k2_|
|++++|
x |_k2_|_-3_|
ou seja, a vari�vel 'v', que mora no endere�o 'k0', agora tem o conte�do
'k2', que � o endere�o de mem�ria onde mora a vari�vel 'x', cujo conte�do �
'-3', endere�o este obtido pelo operado '&' aplicado a vari�vel 'x'
espero q agora vc consiga entender a sa�da do seu pgm!!
por fim, uma dica:
int main(int x) {
.
.
.
x = 5;
.
.
.
}
atribuir valor a um par�metro passado por valor n�o tem sentido... e
provavelmente essa f� n�o se chama 'main'
[]s
---------- Original Message ----------------------------------
From: [EMAIL PROTECTED]
Date: Mon, 1 Oct 2001 17:44:06 -0300
>Ola,
>
>Eu estou com a seguinte duvida em ponteiros em C. =]
>
>Suponha que eu fa�a o seguinte:
>
>#include <stdio.h>
>
>int main( int x){
> int *b;
>
> x=5;
> b=&x
>
> printf("%d %d %d",b,*b,&b);
>
> return(0);
>}
>
>Se eu rodar esse humilde programa ele me retorna-ra:
>
>./programa
>2147482148 5 2147482136
>
>Eu gostaria de saber o q representa cada valor ??
>
>Na verdade, eu nao consegui entender a diferen�a entre usar so a variavel
>ou *variavel ou &variavel.
>
>Eu entendi que:
>
>&variavel => Lugar onde ela esta na memoria
>
>*variavel => Valor atribuido a ela.
>
>variavel => Nao fa�o nem ideia.
>
>Alias, eu to perdidao. Se algum puder fazer um desenho sei la explicando,
>como fica na memoria, sei la! QUalquer ajuda eh bem vinda!
>
>
>Obrigado.
>
>[ ]'s
>
>
>
>___________________________________________________________
>
>http://www.zipmail.com.br O e-mail que vai aonde voc� est�.
>
>
>
>
>
>
--
Rodrigo Canellas
www.EverSystems.com.br
--
Assinantes em 03/10/2001: 2356
Mensagens recebidas desde 07/01/1999: 135202
Historico e [des]cadastramento: http://linux-br.conectiva.com.br
Assuntos administrativos e problemas com a lista:
mailto:[EMAIL PROTECTED]