A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Professor Aquiles Burlamaqui UERN. A memória EndereçoValor 00000000?? 00000001?? 00000002?? 00000003?? 00000004?? 00000005?? 00000006?? 00000007?? 00000008??

Apresentações semelhantes


Apresentação em tema: "Professor Aquiles Burlamaqui UERN. A memória EndereçoValor 00000000?? 00000001?? 00000002?? 00000003?? 00000004?? 00000005?? 00000006?? 00000007?? 00000008??"— Transcrição da apresentação:

1 Professor Aquiles Burlamaqui UERN

2 A memória EndereçoValor 00000000?? 00000001?? 00000002?? 00000003?? 00000004?? 00000005?? 00000006?? 00000007?? 00000008?? 00000009?? 0000000A?? 0000000B?? 0000000C?? 0000000D?? 0000000E?? 0000000F?? 00000010?? Para um melhor entendimento do uso de ponteiros na linguagem de programação C é imprescindível compreender o seu relacionamento com a memória do computador em que o programa esta executando. A memória é formada por várias células. Cada celular contém um endereço e um valor. O Tamanho do endereço e o tamanho do valor depende da arquitetura do computador (ex: 32 bits ou 64 bits). Célula EndereçoValor 0000000D?? Célula

3 Variáveis Caracteres int main() { char i; } i Declaro um caractere chamado i. Os caracteres ocupam 1 bytes na memória(para uma arquitetura de 32 bits). EndereçoValor 00000000?? 00000001?? 00000002?? 00000003?? 00000004?? 00000005?? 00000006?? 00000007?? 00000008?? 00000009?? 0000000A?? 0000000B?? 0000000C?? 0000000D?? 0000000E?? 0000000F?? 00000010??

4 Variáveis Inteiras int main() { int i; } i Declaro um inteiro chamado i. Os inteiros ocupam 4 bytes na memória(para uma arquitetura de 32 bits) EndereçoValor 00000000?? 00000001?? 00000002?? 00000003?? 00000004?? 00000005?? 00000006?? 00000007?? 00000008?? 00000009?? 0000000A?? 0000000B?? 0000000C?? 0000000D?? 0000000E?? 0000000F?? 00000010??

5 Variáveis Flutuantes int main() { float i; } i Declaro um número ponto flutuante chamado i. Os flutuantes ocupam 4 bytes na memória(para uma arquitetura de 32 bits) EndereçoValor 00000000?? 00000001?? 00000002?? 00000003?? 00000004?? 00000005?? 00000006?? 00000007?? 00000008?? 00000009?? 0000000A?? 0000000B?? 0000000C?? 0000000D?? 0000000E?? 0000000F?? 00000010??

6 Variáveis Flutuante Longo int main() { double i; } i Declaro um número ponto flutuante grande chamado i. Os flutuantes ocupam 8 bytes na memória(para uma arquitetura de 32 bits) EndereçoValor 00000000?? 00000001?? 00000002?? 00000003?? 00000004?? 00000005?? 00000006?? 00000007?? 00000008?? 00000009?? 0000000A?? 0000000B?? 0000000C?? 0000000D?? 0000000E?? 0000000F?? 00000010??

7 Declaração de ponteiros int main() { char* c; int* i; float* f; double d; } c Declaração de quatro ponteiros(c,i,f e d). Cada ponteiro de um tipo diferente(char, int, float, double). Todos eles ocupam o mesmo espaço na memória, 4 bytes. Isso acontece porque todos eles armazenam endereços de memória, e o tamanho de um endereço de memória é o mesmo para todos os tipos. i f d EndereçoValor 00000000?? 00000001?? 00000002?? 00000003?? 00000004?? 00000005?? 00000006?? 00000007?? 00000008?? 00000009?? 0000000A?? 0000000B?? 0000000C?? 0000000D?? 0000000E?? 0000000F?? 00000010??

8 Exemplo 1 int main() { int i; i = 15; char c = s; int * p = &i; *p = 25; } i Declaro um inteiro chamado i. Os inteiros ocupam 4 bytes na memória(para uma arquitetura de 32 bits) EndereçoValor 00000000?? 00000001?? 00000002?? 00000003?? 00000004?? 00000005?? 00000006?? 00000007?? 00000008?? 00000009?? 0000000A?? 0000000B?? 0000000C?? 0000000D?? 0000000E?? 0000000F?? 00000010??

9 EndereçoValor 0000000000 0000000100 0000000200 0000000315 00000004?? 00000005?? 00000006?? 00000007?? 00000008?? 00000009?? 0000000A?? 0000000B?? 0000000C?? 0000000D?? 0000000E?? 0000000F?? 00000010?? Exemplo 1 int main() { int i; i = 15; char c = s; int * p = &i; *p = 25; } i Faço uma atribuição. A variável i recebe o valor 15. Esse valor 15 é colocado no campo valor da memória alocada previamente para a variável i. Lembrem que essa notação com o 15 na ultima casa é apenas didática na verdade esse valor é armazenado utilizando a notação complemento de 2(tudo em binário).

10 EndereçoValor 0000000000 0000000100 0000000200 0000000315 00000004s 00000005?? 00000006?? 00000007?? 00000008?? 00000009?? 0000000A?? 0000000B?? 0000000C?? 0000000D?? 0000000E?? 0000000F?? 00000010?? Exemplo 1 int main() { int i; i = 15; char c = s; int * p = &i; *p = 25; } i c Variável c do tipo char criada e inicializada com o valor s. Uma variável do tipo char ocupa 1 byte na memória em nossa arquitetura 32 bits.

11 EndereçoValor 0000000000 0000000100 0000000200 0000000315 00000004s 0000000500 0000000600 0000000700 0000000800 00000009?? 0000000A?? 0000000B?? 0000000C?? 0000000D?? 0000000E?? 0000000F?? 00000010?? Exemplo 1 int main() { int i; i = 15; char c = s; int * p = &i; *p = 25; } i c p Ponteiro de inteiro declarado. O nome desse ponteiro é p e ele é inicializada no momento de sua criação. O valor que esse ponteiro recebe ao ser inicializado é o endereço da variável i(&i) que nesse caso é o endereço 000000. Dizemos que p aponta para i.

12 EndereçoValor 0000000000 0000000100 0000000200 0000000325 00000004s 0000000500 0000000600 0000000700 0000000800 00000009?? 0000000A?? 0000000B?? 0000000C?? 0000000D?? 0000000E?? 0000000F?? 00000010?? Exemplo 1 int main() { int i; i = 15; char c = s; int * p = &i; *p = 25; } i c p Finalizando, fazemos uma atribuição. Colocamos 25 no valor apontado por p. Como visto no slide anterior p aponta para i. Desse modo, colocamos 25 no valor da variável i.

13 Exemplo 2 int main() { char * p1; p1 = malloc(sizeof(char)); int * p2 = malloc(sizeof(int)*2); *p2 = 55; *(p2+1) = 11; } Declaração de um ponteiro para char. p1 EndereçoValor 00000000?? 00000001?? 00000002?? 00000003?? 00000004?? 00000005?? 00000006?? 00000007?? 00000008?? 00000009?? 0000000A?? 0000000B?? 0000000C?? 0000000D?? 0000000E?? 0000000F?? 00000010??

14 Exemplo 2 int main() { char * p1; p1 = malloc(sizeof(char)); int * p2 = malloc(sizeof(int)*2); *p2 = 55; *(p2+1) = 11; } O ponteiro p1 recebe o endereço da primeira posição do espaço reservado pela instrução malloc(...). Nesse caso o malloc aloca 1 byte: sizeof(char) é igual a 1. Dizemos que p1 aponta para o byte reservado pelo malloc. p1 EndereçoValor 0000000000 0000000100 0000000200 0000000304 00000004?? 00000005?? 00000006?? 00000007?? 00000008?? 00000009?? 0000000A?? 0000000B?? 0000000C?? 0000000D?? 0000000E?? 0000000F?? 00000010??

15 Exemplo 2 int main() { char * p1; p1 = malloc(sizeof(char)); int * p2 = malloc(sizeof(int)*2); *p2 = 55; *(p2+1) = 11; } Declaração de um ponteiro para inteiro (p2). Esse ponteiro é inicializado com o valor da primeira posição do espaço alocado pelo malloc. malloc(sizeof(int)*2) aloca 4*2 bytes,ou seja 8 bytes. O espaço equivalente a dois inteiros. p1 EndereçoValor 0000000000 0000000100 0000000200 0000000304 00000004?? 0000000500 0000000600 0000000700 0000000809 00000009?? 0000000A?? 0000000B?? 0000000C?? 0000000D?? 0000000E?? 0000000F?? 00000010?? p2

16 Exemplo 2 int main() { char * p1; p1 = malloc(sizeof(char)); int * p2 = malloc(sizeof(int)*2); *p2 = 55; *(p2+1) = 11; } O valor apontado por p2 recebe 55. p1 EndereçoValor 0000000000 0000000100 0000000200 0000000304 00000004?? 0000000500 0000000600 0000000700 0000000809 0000000900 0000000A00 0000000B00 0000000C55 0000000D?? 0000000E?? 0000000F?? 00000010?? p2

17 Exemplo 2 int main() { char * p1; p1 = malloc(sizeof(char)); int * p2 = malloc(sizeof(int)*2); *p2 = 55; *(p2+1) = 11; } A valor apontado por p2+1 recebe 11. Podemos somar ou subtrair do ponteiro. Com isso podemos fazer com o ponteiro aponte não somente para a primeira posição que lhe foi reservado. p2 => 00000009 + 1 (1 int => 4 bytes) p2+1 0000000D p1 EndereçoValor 0000000000 0000000100 0000000200 0000000304 00000004?? 0000000500 0000000600 0000000700 0000000809 0000000900 0000000A00 0000000B00 0000000C55 0000000D00 0000000E00 0000000F00 0000001011 p2 *p2 *(p2+1)

18 Exemplo 3 int main() { char * p1 = malloc(sizeof(char)*5); char * p2 = malloc(sizeof(char)); *p2 = F; p1 = BOLAS; char * p3 = malloc(sizeof(char)*6); *p3 = *p2; *(p3+1) = *p1; *(p3+2) = *(p1+1); } ---- p1 EndereçoValor 0000000000 0000000100 0000000200 0000000304 00000004B 00000005O 00000006L 00000007A 00000008S 0000000900 0000000A00 0000000B00 0000000C0D 0000000DF 0000000E?? 0000000F?? 00000010?? p2 EndereçoValor 0000001100 0000001200 0000001300 0000001419 00000015B 00000016O 00000017L 00000018A p3 EndereçoValor 00000019F 0000001A00 0000001B00 0000001C04 0000001DB 0000001EO 0000001FL 00000020A


Carregar ppt "Professor Aquiles Burlamaqui UERN. A memória EndereçoValor 00000000?? 00000001?? 00000002?? 00000003?? 00000004?? 00000005?? 00000006?? 00000007?? 00000008??"

Apresentações semelhantes


Anúncios Google