Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Endereos
A memria RAM de qualquer computador uma
sequncia de bytes. Cada byte armazena um de 256
possveis valores. Os bytes so numerados
sequencialmente e o nmero de um byte o seu
endereo (= address).
Cada objeto na memria do computador ocupa um
certo nmero de bytes consecutivos. Um char ocupa
1 byte. Um int ocupa 4 bytes e um double ocupa
8 bytes em muitos computadores. O nmero exato de
bytes de um objeto dado pelo operador sizeof: a
expresso sizeof(int), por exemplo, d o nmero de
bytes de um int no seu computador.
Cada objeto na memria tem um endereo. Na maioria
dos computadores, o endereo de um objeto o
endereo do seu primeiro byte. Por exemplo, depois das
declaraes
charc;
inti;
struct{
intx,y;
}ponto;
intv[4];
Exerccios 1
Ponteiros
Um ponteiro (= apontador = pointer) um tipo especial
de varivel que armazena endereos. Um ponteiro
pode ter o valor especial
NULL
Aplicao
Suponha que precisamos de uma funo que troque os
valores de duas variveis inteiras, digamos i e j.
claro que a funo
voidtroca(inti,intj){//errado!
inttemp;
temp=i;i=j;j=temp;
}
ou talvez
int*p,*q;
p=&i;q=&j;
troca(p,q);
Exerccios 2
1. Verifique que a troca de valores de variveis discutida
acima poderia ser obtida por meio de uma macro do
pr-processador:
2. #definetroca(X,Y){intt=X;X=Y;Y=t;}
3. ...
4. troca(i,j);
10.
Um ponteiro pode ser usado para dizer a uma
funo onde ela deve depositar o resultado de seus
clculos. Escreva uma funo hm que converta minutos
em horas-e-minutos. A funo recebe um inteiro mnts e
os endereos de duas variveis inteiras, digamos h e m,
e atribui valores a essas variveis de modo que m seja
menor que 60 e que 60*h+m seja igual a mnts.
Escreva tambm uma funo main que use a
funo hm.
11.
Escreva uma funo mm que receba um vetor
inteiro v[0..n1] e os endereos de duas variveis
inteiras, digamos min e max, e deposite nessas
variveis o valor de um elemento mnimo e o valor de
um elemento mximo do vetor. Escreva tambm uma
funo main que use a funo mm.
Vetores e endereos
Os elementos de qualquer vetor (= array) tm
endereos consecutivos na memria do computador.
(Na verdade, os endereos no so consecutivos, uma
vez que cada elemento do vetor pode ocupar vrios
bytes. Mas o compilador C acerta os detalhes internos
de modo a criar a iluso de que a diferena entre os
endereos de elementos consecutivos vale 1.) Por
exemplo, depois da declarao
int*v;
v=malloc(100*sizeof(int));
for(i=0;i<100;++i)scanf("%d",
&v[i]);
for(i=0;i<100;++i)scanf("%d",v+
i);
Exerccios 3
1. Suponha que os elementos de um vetor v so do tipo
int e cada int ocupa 8 bytes no seu computador. Se o
endereo de v[0] 55000, qual o valor da expresso v
+3?
2. Suponha que v um vetor declarado assim:
3. intv[100];
11.
O seguinte fragmento de cdigo pretende decidir
se abacate vem antes ou depois de uva no dicionrio.
O que h de errado?
12. char*a,*b;
13. a="abacate";
14. b="uva";
15. if(a<b)
16. printf("%svemantesde%s\n",a,b);
17. else
18. printf("%svemdepoisde%s\n",a,b);