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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> #include <stdlib.h> 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; } </stdlib.h></stdio.h> |
O resultado da execução do código acima deverá ser algo semelhante ao seguinte:
1 2 3 4 5 6 | 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:
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:
1 2 3 | (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:
1 2 3 4 5 6 | 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.
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] |
Este artigo tem mais de um ano
Boa noite, tenho seguido fosso tutotial, tenho gostado imenso e adquirido novos conhecimentos sou programador ainda básico, gostaria de saber se da proxima vão apresentar funções com apontadores ?
Olá Wilson!
Obrigado pelo elogio. Nós também temos que agradecer aos leitores, pois sem eles não existiria o site 🙂
Vou agora escrever o artigo desta quarta-feira e iremos falar sobre declaração e inicialização de apontadores. =D
Cumprimentos,
Mais uma duvida, vossos tutoriais saiem sempre ás quartas-feiras ?
Exatamente 🙂
Muito obrigado já fico a espera no próximo tutorial 😉
boas.
estava a ver o código que vocês têm no tutorial e está errado. vocês têm &caracter mas é sem amp e sem ; .