Upload
vuongdien
View
218
Download
0
Embed Size (px)
Citation preview
ALGORITMOS E
ESRUTRA DE DADOS I Ponteiros
Passagem por Valor e Referência
Alocação de Memória
Agenda
• Ponteiros
• Conceitos gerais
• O que é Ponteiro?
• Declaração de Ponteiros
• Operadores para Ponteiros
• Exemplos
• Exercícios
• Passagem de argumento por valor
• Passagem de argumento por referência
• Alocação Dinâmica de Memória
2
PONTEIROS
3
Conceitos Gerais (1/2)
Três propriedades que um programa deve manter quando armazena
dados:
onde a informação é armazenada;
que valor é mantido lá;
que tipo de informação é armazenada.
A definição de uma variável simples obedece a estes três pontos.
• A declaração provê o tipo e um nome simbólico para o valor.
• Faz também que o programa aloque memória para o valor e mantenha
o local internamente.
4
Conceitos Gerais (2/2)
Como obter o endereço de uma variável na memória?
Aplique o operador de endereço, &, a uma variável para pegar sua
posição.
Exemplo:
5
O que é Ponteiro?
Ponteiros são variáveis que guardam um endereço de
memória.
• int guarda inteiros.
• float guarda números decimais.
• char guarda caracteres.
Na Linguagem C, quando declaramos ponteiros devemos
informar o tipo de variável que será apontada.
6
Declaração de Ponteiros (1/2)
Declaração
Exemplos:
O asterisco (*) que faz o compilador saber que aquela
variável não vai guardar um valor, mas sim um endereço para aquele tipo especificado.
tipo *variavel;
char *ch;
int *i;
float *num;
7
Declaração de Ponteiros (2/2)
8
Operadores para Ponteiros
Para trabalharmos com ponteiros, a Linguagem C disponibiliza
os seguintes operadores:
& Retorna o endereço de memória onde está armazenado
uma variável. Lê-se “o endereço de”.
* O Valor armazenado na variável referenciada por um
ponteiro. Lê-se “o valor apontado por”.
9
Exemplo 1:
int count;
int *m;
count = 5;
m = &count;
Variável Endereço Memória
count 1001 5
m 1200 ?
Variável Endereço Memória
count 1001 5
m 1200 1001
Operador &: retorna o endereço de memória de seu operando.
10
Exemplo 2:
Operador *: O valor da variável localizada no endereço de seu
operando.
int count,q;
int *m;
count = 5;
m = &count;
q = *m;
Variável Endereço Memória
count 1001 5
m 1200 1001
q 1007 ?
Variável Endereço Memória
count 1001 5
m 1200 1001
q 1007 5
11
Exemplo 3
/*declaração das variáveis */
int *p, num;
/* num recebe o valor 5 */
int num = 5;
/* p recebe o endereço de memória de num */
p = #
/* conteúdo de p recebe o valor 8 */
*p = 8;
-
5
206
202
p
num
202
5
206
202
p
num
202
8
206
202
p
num
12
Variável Memória Endereço
Valor de x ? #include "stdafx.h"
#include <stdio.h>
#include <conio.h>
int main(void){
int x;
int *i;
x = 23;
i = &x;
*i = 19;
printf("x = %d",x);
return 0;
}
13
Passagem de Argumentos por Valor
14
Passagem de Argumentos por Valor
• Quando passamos argumentos a uma função, os valores
fornecidos são copiados para as variáveis da função.
• Desta forma, alterações nos parâmetros dentro da função
não alteram os valores que foram passados.
• Exemplos:
15
Passagem de Argumento por Referência
16
Passagem de Argumentos por Referência (1/3)
• No exemplo acima, se x e y fossem passados por
referência, seu conteúdo seria trocado.
17
Passagem de Argumentos por Referência (2/3)
• Alternativa: Passar como argumento para uma função o
endereço da variável, e não o seu valor.
• Desta forma podemos alterar
o conteúdo da variável fazendo
passagem por referência.
• Exemplo:
18
Função scanf (“%d”,&variavel);
Passagem de Argumentos por Referência (3/3)
19
Alocação de Memória
20
Conceitos Gerais
• A alocação de memória, permite criar variáveis em tempo de
execução, ou seja, alocar memória para novas variáveis em
tempo de execução.
• Proporciona uma melhor utilização da memória da máquina,
pois quando criada em tempo de execução não é necessária
a utilização de memória adicional.
• As funções de alocação dinâmica são muito eficiente para a
implementação de arranjos e estruturas de dados. Esta é
outra ferramenta que mostra o poder da Linguagem C.
21
Função Malloc
Serve para alocar memória, ou seja, reserva um numero especifico
de memoria, dependendo do tipo do ponteiro que chama a função.
Sintaxe: (tipo*)(malloc(sizeof(tipo)));
• A função malloc reserva o número de bytes que queremos alocar
na memória e retorna um ponteiro void * para o primeiro byte
alocado.
• O ponteiro void * pode ser atribuído a qualquer tipo de ponteiro.
Lembre-se que cada tipo de dados possui um numero reservado
de byte.
• Se não houver memória suficiente para alocar a memória
requisitada a função malloc() retorna um ponteiro nulo.
22
Exemplo de Alocação de um tipo int (1/2)
int *p = (int*)(malloc(sizeof(int);
• Foi declarado um ponteiro p do tipo int, e alocado um
endereço de memória (4 bytes).
• A primeira referência ao tipo (int *) na instrução esta
relacionada a variável de retorno, ou seja, a variável que
chama a função malloc, um ponteiro do tipo int.
• A primeira referência ao tipo (int) na instrução esta
relacionada a alocação solicitada, ou seja, uma solicitação
de endereço de tamanho int.
23
Exemplo de Alocação de um tipo int (2/2)
#include <stdio.h>
#include <stdlib.h>
int main (void){
int *p;
p=(int *)malloc(sizeof(int));
if (!p){
printf ("** Erro: Memoria Insuficiente **");
exit;
}else{
printf ("** Memoria Alocada com Sucesso **");
}
return 0;
}
24