Organização de memória, stack, heap II
Contato
- Jean Paulo Martins (jeanmartins utfpr edu br)
- Sala 105, Bloco S (UTFPR - Campus Pato Branco)
Conteúdo
Referências
-
Material sobre linguagem C (IME-USP)
- https://www.ime.usp.br/~slago/slago-C.pdf
-
Material sobre memória e ponteiros (cap2::stanford)
- http://cslibrary.stanford.edu/102/PointersAndMemory.pdf
-
Notas sobre estruturas de dados e programação (cap4:yale)
- http://cs-www.cs.yale.edu/homes/aspnes/classes/223/notes.pdf
-
Livro (cap11.9:Write greate code)
- http://pdf.th7.cn/down/files/1312/write_great_code_volume_1.pdf
-
stackoverflow:O que são e onde estão o stack e heap?
- https://pt.stackoverflow.com/questions/3797/o-que-s%C3%A3o-e-onde-est%C3%A3o-o-stack-e-heap
-
LEIA LIVROS SOBRE PROGRAMAÇÃO!
Revisão prática
-
Alterar o código da aula anterior para dinamicamente alocar o tamanho do vetor pessoas
// Versão atual Pessoa lista[NUM_PESSOAS]; // Versão nova int num_pessoas; scanf("%d", &num_pessoas); Pessoa lista[num_pessoas];
-
Ex: Criar dois ponteiros para inteiro apontando para a mesma memória
int c = 10; int* ptr1 = &c; int* ptr2 = &c;
-
Ex: Criar uma função que receba uma
Pessoa
e atribua valores de uma linha do arquivovoid read_pessoa(Pessoa* p) { scanf("%st%d%ld", p->nome, &(p->idade), &(p->cpf)); }
-
Acessando ponteiros de
struct
com->
vs.
Pessoa p; p.idade = 30; p.cpf = 8388383; Pessoa* ptr_p; p->idade = 30; p->cpf = 8383838;
Ponteiros
Dereferenciando um ponteiros
Um ponteiro é uma referência a um valor armazenado em outra posição de memória.
-
Como seguir o ponteiro e acessar o valor armazenado?
-
Essa operação se chama dereferenciação:
-
int* p = &c;
-
*p = 10;
Operação válida, atribui 10 emc
(dereferenciação de p) -
p = 10;
fazp
armazenar o endereço de memória10
(faz p armazenar o endereço 10) -
p[0] == c
mesmo sep
não for um vetor (dereferenciação sintaxe de vetores)
-
#include<stdlib.h>
#include <stdio.h>
int main() {
int c = 10;
int* ptr = &c;
// ptr = 1999;
*ptr = 18765;
ptr[0] = 9876;
return 0;
}
O ponteiro NULL
A constante NULL é um ponteiro especial que codifica a ideia de que um ponteiro está apontando para o nada.
-
Em C, NULL é igual a zero, portanto pode ser utilizado como Boolean false.
-
Como zero é um endereço não acessível, dereferenciar NULL gera um erro