Buscar

01 - Memória e Endereço

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

Mais conteúdos dessa disciplina