Pplware

Vamos Programar? – Introdução à Programação #17

Apontadores: endereçamento

O mundo está constantemente a evoluir: desde o mais pequeno inseto à espécie Humana. Dentro das palavras que mais ouvimos atualmente, incluímos “evolução”, “mudança”, “futuro”.

A tecnologia tem revolucionado o mundo das mais diversas formas: do mais simples aparelho para medir o tempo ao mais complexo acelerador de partículas. Se quer entrar no mundo da tecnologia e deixar a sua marca, pode começar aqui.

Visualize este vídeo no YouTube

Apontadores

Na semana passada, começámos a abordar o tema “Apontadores”. Esta semana, iremos continuar a abordar esse mesmo tema que é muito útil.

Tamanho e endereço de variáveis

Primeiramente, devo recordar que todos os tipos de dados ocupam um espaço diferente na memória RAM. Para saber quantas bytes ocupam um determinado tipo, deve-se recorrer à função sizeof cujo único argumento é a variável em questão.

Ou seja, para se saber quantas bytes ocupa o tipo int, devemos passar como argumento à função sizeof uma variável desse tipo.

No seguinte exemplo é imprimido o tamanho de espaço que ocupam quatro tipos de dados e ainda o endereço da memória a que corresponde cada variável.

#include 
#include 

int main()
{
  char caractere;
  int inteiro;
  float Float;
  double Double;

  printf("Tipo\tNum de Bytes\tEndereço\n");
  printf("-------------------------------------\n");
  printf("Char\t%d byte \t\t%p\n", sizeof(caractere), &caractere);
  printf("Inteiro\t%d bytes \t%p\n", sizeof(inteiro), &inteiro);
  printf("Float\t%d bytes \t%p\n", sizeof(Float), &Float);
  printf("Double\t%d bytes \t%p\n", sizeof(Double), &Double);

  return 0;
}

O resultado da execução do código acima deverá ser algo semelhante ao seguinte:

Tipo	Num de Bytes	Endereço
-------------------------------------
Char	1 byte 		0028FF1F
Inteiro	4 bytes 	0028FF18
Float	4 bytes 	0028FF14
Double	8 bytes 	0028FF08

Como pode verificar, todos os tipos de dados exceto char ocupam mais do que um byte na memória RAM. Então, o endereço que é imprimido corresponde apenas ao primeiro byte ocupado pela variável.

Hexadecimal para Decimal

Antes de continuarmos, será útil abordar como se convertem números hexadecimais para decimais. Primeiramente, como já deve ter reparado, os números hexadecimais contam com letras, além de números.

Isto acontece porque a numeração hexadecimal tem como base 16 números enquanto que a decimal tem como base 10 números. Veja então o número que corresponde a cada letra da numeração hexadecimal na tabela seguinte:

Hexadecimal Decimal Hexadecimal Decimal
0 0 8 8
1 1 9 9
2 2 A 10
3 3 B 11
4 4 C 12
5 5 D 13
6 6 E 14
7 7 F 15

Iremos converter o número hexadecimal 0028FF1F para decimal. Em primeiro lugar, iremos tirar os primeiros dois zeros que são, neste caso, desprezíveis.

De seguida precisamos conhecer o significado de cada dígito hexadecimal em número decimal que está presente nesse número. Em decimal, os números 2, 8, F e 1 são, respetivamente, 2, 8, 15 e 1.

Para efetuar a conversão, temos que multiplicar cada um desses números por uma potência de base 16 cujo expoente é igual à posição de cada um dos números (da direita para a esquerda). Então, temos:

  (2*16^5)+(8*16^4)+(15*16^3)+(15*16^2)+(1*16^1)+(15*16^0) =
= 2097152+524288+61440+3840+16+15 = 
= 2686751

Voltando aos endereços das variáveis e convertendo-os para números decimais, obtemos os seguintes valores:

Tipo	Num de Bytes	Endereço
-------------------------------------
Char	1 byte 		2686751
Inteiro	4 bytes 	2686744
Float	4 bytes 	2686740
Double	8 bytes 	2686728

Podemos concluir dos dados acima que a variável que declarámos do tipo char, no meu computador, ocupa a posição 2686751 enquanto que as outras ocupam mais do que uma.

Relembrando que as bytes alocadas para variáveis que ocupam mais do que uma encontram-se localizadas lado a lado, de seguida e que o endereço que obtemos corresponde ao da primeira byte, a variável do tipo inteiro que declarámos ocupa as bytes cujos endereços (em número decimal) são 2686744, 2686745, 2686746 e 2686747.

Estas informação serão muito úteis para os próximos artigos. Fique atento.


Esta semana não iremos recomendar exercícios pois o conteúdo de hoje não é suficiente para novos exercícios. Porém, continue a praticar! Na próxima semana iremos continuar o tema dos apontadores.

Mais uma vez, gostávamos de saber a sua opinião. Caso tenha alguma dúvida, pode sempre utilizar os comentários para colocar a questão. Caso o faça,  pedimos que utilize a keyword [DUVIDA] no início do seu comentários.

Resoluções de exercícios.

Esta saga

Henrique Dias

Mais episódios:  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13][12] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23][24]

Exit mobile version