Buscar

Aula___Ponteiros

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

Continue navegando