Baixe o app para aproveitar ainda mais
Prévia do material em texto
Ponteiros e alocação de memória Caio Santiago caio.rafael@unasp.edu.br Ciências da Computação Engenharia da Computação UNASP Caio Santiagocaio.rafael@unasp.edu.br (UNASP) Ponteiros e alocação de memória 1 / 8 O que são ponteiros Ponteiros são variáveis e isso quer dizer que eles guardam valores e possuem um endereço de memória. O que difere um ponteiro para uma variável comum é que ponteiros guardam valores que são os endereços de memória de outras variáveis. Exemplo : 1 int a;// Declaracao de uma variavel inteira 2 int *p; // Declaracao de um ponteiro de uma variavel inteira Caio Santiagocaio.rafael@unasp.edu.br (UNASP) Ponteiros e alocação de memória 2 / 8 Endereçamento Toda variável possui um endereço na memória. Este endereço é um número inteiro que é usado para acessar o valor na memória. Na linguagem C/C++ o “&” é utilizado para pegar o endereço de memória de uma variável. Exemplo : 1 int a = 10; 2 int *p; 3 p = &a; 4 5 scanf("%d", &a); // Ler um numero e colocar esse numero dentro do endereco de a Para acessar o valor dentro de endereço apontado pelo ponteiro é preciso utilizar um “*” antes do nome da variável. Caio Santiagocaio.rafael@unasp.edu.br (UNASP) Ponteiros e alocação de memória 3 / 8 Alteração de ponteiro Uma vez que um ponteiro aponta para uma variável, não importa se uma alteração é feita na variável ou no ponteiro, nos duas lugares a alteração é feita. Isso acontece porque existem “dois” lugares na memória, só existe um lugar (que é o endereço), e no final das contas o que está sendo feito é acessar o mesmo endereço utilizando formas diferentes. Exemplo : 1 int a = 10; 2 int *p; 3 p = &a; 4 *p = 20; 5 6 printf ("%d %d\n", a, *p); // Resultado eh ’20 20’ Caio Santiagocaio.rafael@unasp.edu.br (UNASP) Ponteiros e alocação de memória 4 / 8 Alocação dinâmica de memória A alocação dinâmica de memória é feita usando malloc na linguagem C. Exemplo : 1 int * p = (int *) malloc ( sizeof (int)); 2 free(p); Caio Santiagocaio.rafael@unasp.edu.br (UNASP) Ponteiros e alocação de memória 5 / 8 Alocação dinâmica de memória A alocação dinâmica de memória é feita usando malloc na linguagem C. Exemplo : 1 int * p = (int *) malloc ( sizeof (int)); 2 free(p); Malloc : O malloc retorna um endereço de memória. Este endereço estava antes do malloc e é reservado/escolhido pelo sistema operacional que impede de outras variáveis de utilizar esse mesmo endereço. Alocação de memória Caio Santiagocaio.rafael@unasp.edu.br (UNASP) Ponteiros e alocação de memória 5 / 8 Alocação dinâmica de memória A alocação dinâmica de memória é feita usando malloc na linguagem C. Exemplo : 1 int * p = (int *) malloc ( sizeof (int)); 2 free(p); Sizeof : O malloc precisa saber quantos bytes precisa reservar, essa informação é passada como parâmetro. A função sizeof facilita o trabalho de descobrir o tamanho de em bytes de um tipo de variável. Tamanho em bytes Caio Santiagocaio.rafael@unasp.edu.br (UNASP) Ponteiros e alocação de memória 5 / 8 Alocação dinâmica de memória A alocação dinâmica de memória é feita usando malloc na linguagem C. Exemplo : 1 int * p = (int *) malloc ( sizeof (int)); 2 free(p); Cast : O malloc retorna um endereço de memória genérico, também conhecido como void *, sendo necessário converter para o tipo desejado. A conversão de tipos de dados é chamada de casting. Cast Caio Santiagocaio.rafael@unasp.edu.br (UNASP) Ponteiros e alocação de memória 5 / 8 Alocação dinâmica de memória A alocação dinâmica de memória é feita usando malloc na linguagem C. Exemplo : 1 int * p = (int *) malloc ( sizeof (int)); 2 free(p); Free : Uma vez que a variável não é mais necessária, é preciso libera-la para outros usos. Caio Santiagocaio.rafael@unasp.edu.br (UNASP) Ponteiros e alocação de memória 5 / 8 Alocação dinâmica de memória O malloc também pode ser utilizado para construir vetores com tamanho definido de forma dinâmica. Exemplo : 1 #i n c l u d e <s t d i o . h> 2 #i n c l u d e < s t d l i b . h> 3 i n t somato r i o ( i n t ∗v , i n t tam ) { 4 i n t i , soma = 0 ; 5 f o r ( i = 0 ; i < tam ; i ++) 6 soma += v [ i ] ; 7 r e t u r n soma ; 8 } 9 10 i n t main ( ) { 11 i n t i , n ; 12 s c a n f ( "%d" , &n ) ; 13 i n t ∗ v = ( i n t ∗) ma l l o c ( s i z e o f ( i n t ) ∗ n ) ; // Vetor de 10 p o s i c o e s 14 f o r ( i = 0 ; i < n ; i ++) 15 s c a n f ( "%d" , &v [ i ] ) 16 p r i n t f ( "%d" , somato r i o ( v , n ) ) ; 17 f r e e ( p ) ; 18 r e t u r n 0 ; 19 } Caio Santiagocaio.rafael@unasp.edu.br (UNASP) Ponteiros e alocação de memória 6 / 8 Material de apoio https://www.youtube.com/watch?v=r7f-aR7vgg0&list= PLa75BYTPDNKbhUVggmU3JUEBPibvh0C2t https://youtu.be/rf5BHtVYDIk Caio Santiagocaio.rafael@unasp.edu.br (UNASP) Ponteiros e alocação de memória 7 / 8 https://www.youtube.com/watch?v=r7f-aR7vgg0&list=PLa75BYTPDNKbhUVggmU3JUEBPibvh0C2t https://www.youtube.com/watch?v=r7f-aR7vgg0&list=PLa75BYTPDNKbhUVggmU3JUEBPibvh0C2t https://youtu.be/rf5BHtVYDIk Exercícios 1 Receber dois vetores como parâmetro e retorna um vetor que é a combinação dos dois. 2 Construir uma matriz de n por n, sendo que n é dado por parâmetro. 3 Construir um vetor de um tipo struct. 4 Fazer uma função que aumenta em 1 o tamanho de um vetor e adiciona um novo valor (do por parâmetro) ao final do vetor. Caio Santiagocaio.rafael@unasp.edu.br (UNASP) Ponteiros e alocação de memória 8 / 8
Compartilhar