Prévia do material em texto
Estruturas de Dados Aula 01. Memória e Endereço Karina Mochetti 2018.1 Karina Mochetti Aula 01. Memória e Endereço Memória Dispositivo que armazena dados utilizando bits (0 e 1) como unidade base. Normalmente representamos a memória como uma sequência de bytes (8 bits). 01110101 01110111 00010101 01101001 01011011 00010011 00101111 01010101 Karina Mochetti Aula 01. Memória e Endereço Memória Cada byte da memória está em uma posição numerada. Essa posição é chamada endereço de memória. 0x0022FF77: 01110101 0x0022FF78: 01110111 0x0022FF79: 00010101 0x0022FF7A: 01101001 0x0022FF7B: 01011011 0x0022FF7C: 00010011 0x0022FF7D: 00101111 Esse endereços possuem sempre valores altos representados em hexadecimais. Para um computador com 1GB de RAM os valores vão de 0x00000000 a 0x3B9ACA00. Karina Mochetti Aula 01. Memória e Endereço Memória Cada byte da memória está em uma posição numerada. Essa posição é chamada endereço de memória. 0x0022FF77: 01110101 0x0022FF78: 01110111 0x0022FF79: 00010101 0x0022FF7A: 01101001 0x0022FF7B: 01011011 0x0022FF7C: 00010011 0x0022FF7D: 00101111 Esse endereços possuem sempre valores altos representados em hexadecimais. Para um computador com 1GB de RAM os valores vão de 0x00000000 a 0x3B9ACA00. Karina Mochetti Aula 01. Memória e Endereço Memória de um Programa Ao executarmos um programa, um trecho de memória é alocado para ele. A cada execução a posição desse trecho muda, logo, a cada execução os endereços de memória mudam. int main() { char a, b, c; return 0; } 0x0022FF77: 01110101 0x0022FF78: 01110111 0x0022FF79: 00010101 ⇒ a 0x0022FF7A: 01101001 ⇒ b 0x0022FF7B: 01011011 ⇒ c 0x0022FF7C: 00010011 0x0022FF7D: 00101111 0x0022FF7E: 01010101 Karina Mochetti Aula 01. Memória e Endereço Memória de um Programa Ao executarmos um programa, um trecho de memória é alocado para ele. A cada execução a posição desse trecho muda, logo, a cada execução os endereços de memória mudam. int main() { char a, b, c; return 0; } 0x003A458A: 01011011 0x003A458B: 01010101 0x003A458C: 01101001 ⇒ a 0x003A458D: 01101001 ⇒ b 0x003A458E: 00010011 ⇒ c 0x003A458F: 01110011 0x003A4590: 10101001 0x003A4591: 00011101 Karina Mochetti Aula 01. Memória e Endereço Escopo Escopo é um trecho de programa em que todas as linhas serão executadas juntas. Normalmente é indicado pela indentação, em C é indicado pelas abertura e fechamento de chaves. char soma (char a) { char b = ’a’; return a+b; } int main() { char a, b; for (int i=0; i<3; i++) b = soma(a); return 0; } 0x003A458A: 01011011 0x003A458B: 01010101 0x003A458C: 01101001 0x003A458D: 01101001 0x003A458E: 00010011 0x003A458F: 01110011 0x003A4590: 10101001 0x003A4591: 00011101 Karina Mochetti Aula 01. Memória e Endereço Escopo Escopo é um trecho de programa em que todas as linhas serão executadas juntas. Normalmente é indicado pela indentação, em C é indicado pelas abertura e fechamento de chaves. char soma (char a) { char b = ’a’; return a+b; } int main() { char a, b; for (int i=0; i<3; i++) b = soma(a); return 0; } 0x003A458A: 01011011 0x003A458B: 01010101 0x003A458C: 01101001 ⇒ a 0x003A458D: 01101001 ⇒ b 0x003A458E: 00010011 0x003A458F: 01110011 0x003A4590: 10101001 0x003A4591: 00011101 Karina Mochetti Aula 01. Memória e Endereço Escopo Escopo é um trecho de programa em que todas as linhas serão executadas juntas. Normalmente é indicado pela indentação, em C é indicado pelas abertura e fechamento de chaves. char soma (char a) { char b = ’a’; return a+b; } int main() { char a, b; for (int i=0; i<3; i++) b = soma(a); return 0; } 0x003A458A: 01011011 0x003A458B: 01010101 0x003A458C: 01101001 ⇒ a 0x003A458D: 01101001 ⇒ b 0x003A458E: 00010011 ⇒ i 0x003A458F: 01110011 ⇒ i 0x003A4590: 10101001 ⇒ i 0x003A4591: 00011101 ⇒ i Karina Mochetti Aula 01. Memória e Endereço Escopo Escopo é um trecho de programa em que todas as linhas serão executadas juntas. Normalmente é indicado pela indentação, em C é indicado pelas abertura e fechamento de chaves. char soma (char a) { char b = ’a’; return a+b; } int main() { char a, b; for (int i=0; i<3; i++) b = soma(a); return 0; } 0x003A458A: 01011011 0x003A458B: 01010101 0x003A458C: 01101001 ⇒ a 0x003A458D: 01101001 ⇒ b 0x003A458E: 00010011 ⇒ i 0x003A458F: 01110011 ⇒ i 0x003A4590: 10101001 ⇒ i 0x003A4591: 00011101 ⇒ i Karina Mochetti Aula 01. Memória e Endereço Escopo Escopo é um trecho de programa em que todas as linhas serão executadas juntas. Normalmente é indicado pela indentação, em C é indicado pelas abertura e fechamento de chaves. char soma (char a) { char b = ’a’; return a+b; } int main() { char a, b; for (int i=0; i<3; i++) b = soma(a); return 0; } 0x003A458A: 01101001 ⇒ a 0x003A458B: 01010101 0x003A458C: 01101001 ⇒ a 0x003A458D: 01101001 ⇒ b 0x003A458E: 00010011 ⇒ i 0x003A458F: 01110011 ⇒ i 0x003A4590: 10101001 ⇒ i 0x003A4591: 00011101 ⇒ i Karina Mochetti Aula 01. Memória e Endereço Escopo Escopo é um trecho de programa em que todas as linhas serão executadas juntas. Normalmente é indicado pela indentação, em C é indicado pelas abertura e fechamento de chaves. char soma (char a) { char b = ’a’; return a+b; } int main() { char a, b; for (int i=0; i<3; i++) b = soma(a); return 0; } 0x003A458A: 01101001 ⇒ a 0x003A458B: 01100001 ⇒ b 0x003A458C: 01101001 ⇒ a 0x003A458D: 01101001 ⇒ b 0x003A458E: 00010011 ⇒ i 0x003A458F: 01110011 ⇒ i 0x003A4590: 10101001 ⇒ i 0x003A4591: 00011101 ⇒ i Karina Mochetti Aula 01. Memória e Endereço Escopo Escopo é um trecho de programa em que todas as linhas serão executadas juntas. Normalmente é indicado pela indentação, em C é indicado pelas abertura e fechamento de chaves. char soma (char a) { char b = ’a’; return a+b; } int main() { char a, b; for (int i=0; i<3; i++) b = soma(a); return 0; } 0x003A458A: 01101001 ⇒ a 0x003A458B: 01100001 ⇒ b 0x003A458C: 01101001 ⇒ a 0x003A458D: 01101001 ⇒ b 0x003A458E: 00010011 ⇒ i 0x003A458F: 01110011 ⇒ i 0x003A4590: 10101001 ⇒ i 0x003A4591: 00011101 ⇒ i Karina Mochetti Aula 01. Memória e Endereço Escopo Escopo é um trecho de programa em que todas as linhas serão executadas juntas. Normalmente é indicado pela indentação, em C é indicado pelas abertura e fechamento de chaves. char soma (char a) { char b = ’a’; return a+b; } int main() { char a, b; for (int i=0; i<3; i++) b = soma(a); return 0; } 0x003A458A: 01101001 0x003A458B: 01100001 0x003A458C: 01101001 ⇒ a 0x003A458D: 11001010 ⇒ b 0x003A458E: 00010011 ⇒ i 0x003A458F: 01110011 ⇒ i 0x003A4590: 10101001 ⇒ i 0x003A4591: 00011101 ⇒ i Karina Mochetti Aula 01. Memória e Endereço Escopo Escopo é um trecho de programa em que todas as linhas serão executadas juntas. Normalmente é indicado pela indentação, em C é indicado pelas abertura e fechamento de chaves. char soma (char a) { char b = ’a’; return a+b; } int main() { char a, b; for (int i=0; i<3; i++) b = soma(a); return 0; } 0x003A458A: 01101001 0x003A458B: 01100001 0x003A458C: 01101001 ⇒ a 0x003A458D: 11001010 ⇒ b 0x003A458E: 00010011 0x003A458F: 01110011 0x003A4590: 10101001 0x003A4591: 00011101 Karina Mochetti Aula 01. Memória e Endereço Endereço de Memória Ao colocarmos o símbolo & temos o endereço daquela variável. 0x0022FF77: 01110101 0x0022FF78: 01110111 0x0022FF79: 00010101 0x0022FF7A: 11001010 0x0022FF7B: 01011011 0x0022FF7C: 00010011 0x0022FF7D: 00101111 Karina Mochetti Aula 01. Memória e Endereço Endereço de Memória Ao colocarmos o símbolo & temos o endereço daquela variável. int main() { char c=’a’; int n=0; printf("Valor de c: %x\n", c); printf("Valor de n: %x\n", n); printf("Endereço de c: %x\n", &c); printf("Endereço de n: %x\n", &n); return 0; } 0x003A458A: 01100001 c 0x003A458B: 00000000 n 0x003A458C: 00000000 n 0x003A458D: 00000000 n 0x003A458E: 00000000 n 0x003A458F: 00010101 Valor de c: 0x61 Valor de n: 0x00000000 Endereço de c: 0x003A458A Endereço de n: 0x003A458B Karina Mochetti Aula 01. Memória e Endereço Endereço de Memória O argumento do printf() determina quantos bits serão lidos.int main() { long long int n1=1; long long int n2; n2=9223372036854775807; printf("Valor de n1: %d\n", n1); printf("Valor de n1: %lld\n", n1); printf("Valor de n2: %d\n", n2); printf("Valor de n2: %lld\n", n2); return 0; } Valor de n1: 1 Valor de n1: 1 Valor de n2: -1 Valor de n2: 9223372036854775807 0x003A458A: 00000000 n1 0x003A458B: 00000000 n1 0x003A458C: 00000000 n1 0x003A458D: 00000000 n1 0x003A458E: 00000000 n1 0x003A458C: 00000000 n1 0x003A458D: 00000000 n1 0x003A458E: 00000001 n1 0x003A458A: 01111111 n2 0x003A458B: 11111111 n2 0x003A458C: 11111111 n2 0x003A458D: 11111111 n2 0x003A458E: 11111111 n2 0x003A458C: 11111111 n2 0x003A458D: 11111111 n2 0x003A458E: 11111111 n2 Karina Mochetti Aula 01. Memória e Endereço Exemplo 1 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(a); return 0; } 0x003A458A: 1108493652 0x003A458E: 2503071976 0x003A4592: -1605829989 0x003A4596: -980521430 Karina Mochetti Aula 01. Memória e Endereço Exemplo 1 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(a); return 0; } 0x003A458A: 1108493652 0x003A458E: 2503071976 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 1 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(a); return 0; } 0x003A458A: 1108493652 0x003A458E: 2503071976 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 1 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(a); return 0; } 0x003A458A: 11111 a 0x003A458E: 2503071976 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 1 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(a); return 0; } 0x003A458A: 11111 a 0x003A458E: 1234 b 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 1 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(a); return 0; } 0x003A458A: 12345 a 0x003A458E: 1234 b 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 1 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(a); return 0; } 0x003A458A: 12345 a 0x003A458E: 1234 b 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 1 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(a); return 0; } 0x003A458A: 12345 0x003A458E: 1234 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 1 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(a); return 0; } 0x003A458A: 12345 0x003A458E: 1234 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 2 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(&a); return 0; } 0x003A458A: 1108493652 0x003A458E: 2503071976 0x003A4592: -1605829989 0x003A4596: -980521430 Karina Mochetti Aula 01. Memória e Endereço Exemplo 2 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(&a); return 0; } 0x003A458A: 1108493652 0x003A458E: 2503071976 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 2 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(&a); return 0; } 0x003A458A: 1108493652 0x003A458E: 2503071976 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 2 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(&a); return 0; } 0x003A458A: 0x003A4596 a 0x003A458E: 2503071976 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 2 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(&a); return 0; } 0x003A458A: 0x003A4596 a 0x003A458E: 0x04D2 b 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 2 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(&a); return 0; } 0x003A458A: 0x003A4A68 a 0x003A458E: 0x04D2 b 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 2 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(&a); return 0; } 0x003A458A: 0x003A4A68 a 0x003A458E: 0x04D2 b 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 2 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(&a); return 0; } 0x003A458A: 0x003A4A68 0x003A458E: 0x04D2 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 2 void soma(int a) { int b = 1234; a = a+b; return; } int main() { int a = 11111; soma(&a); return 0; } 0x003A458A: 0x003A4A68 0x003A458E: 0x04D2 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 3 int soma (int a) { int b = 1234; a = a+b; return a; } int main() { int a = 11111; a = soma(&a); return 0; } 0x003A458A: 1108493652 0x003A458E: 74823 0x003A4592: -1605829989 0x003A4596: 12345 Karina Mochetti Aula 01. Memória e Endereço Exemplo 3 int soma (int a) { int b = 1234; a = a+b; return a; } int main() { int a = 11111; a = soma(&a); return 0; } 0x003A458A: 1108493652 0x003A458E: 74823 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 3 int soma (int a) { int b = 1234; a = a+b; return a; } int main() { int a = 11111; a = soma(&a); return 0; } 0x003A458A: 1108493652 0x003A458E: 74823 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 3 int soma (int a) { int b = 1234; a = a+b; return a; } int main() { int a = 11111; a = soma(&a); return 0; } 0x003A458A: 0x003A4596 a 0x003A458E: 74823 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 3 int soma (int a) { int b = 1234; a = a+b; return a; } int main() { int a = 11111; a = soma(&a); return 0; } 0x003A458A: 0x003A4596 a 0x003A458E: 1234 b 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 3 int soma (int a) { int b = 1234; a = a+b; return a; } int main() { int a = 11111; a = soma(&a); return 0; } 0x003A458A: 0x003A4A68 a 0x003A458E: 1234 b 0x003A4592: -1605829989 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 3 int soma (int a) { int b = 1234; a = a+b; return a; } int main() { int a = 11111; a = soma(&a); return 0; } 0x003A458A: 0x003A4A68 a 0x003A458E: 1234 b 0x003A4592: 0x003A4A68 ret 0x003A4596: 11111 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 3 int soma (int a) { int b = 1234; a = a+b; return a; } int main() { int a = 11111; a = soma(&a); return 0; } 0x003A458A: 0x003A4A68 0x003A458E: 1234 0x003A4592: 0x003A4A68 0x003A4596: 0x003A4A68 a Karina Mochetti Aula 01. Memória e Endereço Exemplo 3 int soma (int a) { int b = 1234; a = a+b; return a; } int main() { int a = 11111; a = soma(&a); return 0; } 0x003A458A: 0x003A4A68 0x003A458E: 1234 0x003A4592: 0x003A4A68 0x003A4596: 0x003A4A68 a Karina Mochetti Aula 01. Memória e Endereço Endereços e Inteiros Endereços são inteiros, logo é possível fazer quaisquer operações com eles como inteiros. Um endereço pode ser um int ou long ou long long, dependendo do tamanho da memória. O compilador pode dar erro ou warning quando um programa realiza operações com endereços de memória. Cada execução terá um endereço diferente, assim, os valores serão aparentemente aleatórios e normalmentemuito grandes. Karina Mochetti Aula 01. Memória e Endereço Vetores Todos os elementos de um vetor são sempre alocados sequencialmente na memória. int main() { char a; char v[5]; char b; return 0; } 0x003A458A: 00001010 ⇒ a [] 0x003A458B: 01010101 ⇒ v[0] 0x003A458C: 01101001 ⇒ v[1] 0x003A458D: 10101001 ⇒ v[2] 0x003A458E: 00001010 ⇒ v[3] 0x003A458F: 01110011 ⇒ v[4] 0x003A4590: 10101001 [] 0x003A4591: 00011101 ⇒ b [] Karina Mochetti Aula 01. Memória e Endereço Exercício Assuma que os valores são alocados sequencialmente a partir do endereço 0x003A458E. O que será impresso pelo programa abaixo? int main() { char c = ’A’; unsigned long long int nlu = 1234567890123457890; int n = 12345; long long int nl= -987654321987654321; printf("Valor de c: %c\n", c); printf("Valor de c: %d\n", c); printf("Valor de n: %d\n", n); printf("Valor de n: %hu\n", n); printf("Valor de n: %lld\n", n); printf("Valor de nl: %d\n", nl); printf("Valor de nl: %lld\n", nl); printf("Valor de nl: %llu\n", nl); printf("Valor de nlu: %d\n", nlu); printf("Valor de nlu: %lld\n", nlu); printf("Valor de nlu: %llu\n", nlu); printf("Endereço de c: %x\n", &c); printf("Endereço de n: %x\n", &n); printf("Endereço de nl: %x\n", &nl); printf("Endereço de nlu: %x\n", &nlu); } Karina Mochetti Aula 01. Memória e Endereço