Ponteiros e Vetores, Aloca§£o Din¢ cz/if165/NotasAulas/10aulaIP-   Passagem

  • View
    215

  • Download
    0

Embed Size (px)

Text of Ponteiros e Vetores, Aloca§£o Din¢ cz/if165/NotasAulas/10aulaIP-   Passagem

Introduo a Programao

Ponteiros e Vetores, Alocao

Dinmica

2

Tpicos da Aula

Hoje aprenderemos que existe uma forte

relao entre ponteiros e vetores

Associao entre ponteiros e vetores

Ponteiros constantes x Ponteiros variveis

Passagem de ponteiros invs de vetores para

funes

Comando sizeof

Alocao dinmica

Vetores dinmicos

3

Considere a declarao:

O smbolo v

Representa o vetor

uma constante que representa seu endereo

inicial

Aponta para o primeiro elemento do vetor

Associao entre Vetores e Ponteiros

int v [10] ;

4

Ponteiros e Vetores (matrizes)

Em C existe um relacionamento muito forte

entre ponteiros e vetores

O compilador entende todo vetor e matriz como

ponteiros, pois a maioria dos computadores capaz

de manipular ponteiros e no vetores

Qualquer operao que possa ser feita com ndices

de um vetor pode ser feita com ponteiros

O identificador de um vetor representa um endereo,

ou seja, um ponteiro

5

Como vimos, C permite aritmtica de ponteiros

Se tivermos a declarao

Podemos acessar elementos do vetor atravs

de aritmtica de ponteiros

Ponteiros e Vetores

Aponta para (igual ao endereo do) primeiro

elemento do vetor v + 0

Aponta para o segundo elemento do vetor v + 1

Aponta para o ltimo elemento do vetor v + 9

Portanto: &v[i](v + i) v[i] *(v + i)

int v [10] ;

6

Representando Ponteiros e Vetores na

Memria

100

101

102

103

104

105

106

107

108

109

110

111

6

10

7

v + 2 &v[2] 108

*(v + 2) v[2] 7

Memria int v[] = {6,10,7};

v + 1 &v[1] 104

*(v + 1) v[1] 10

v &v[0] 100

*v v[0] 6

7

Ponteiros e Vetores

int a[10];

int *pa;

pa = &a[0];

pa = a;

Vetores podem ser tratados como ponteiros em C!

*pa a[0] pa[0]

*(pa+i) a[i]

pa[i] *(a+i)

a+i &a[i]

Expresses Equivalentes!

pa = &a[0]; pa = a;

8

Usando Notao de Ponteiros para

Vetores

int main( ) {

int nums[ ] = {1, 4, 8};

int cont;

for(cont=0; cont < 3; cont++) {

printf(%d\n,nums[cont]);

}

}

int main( ) {

int nums[ ] = {1, 4, 8};

int cont;

for(cont=0; cont < 3; cont++) {

printf(%d\n,*(nums + cont));

}

}

Verso com Ponteiro

Verso com Vetor

9

Ponteiros Constantes x Ponteiros

Variveis

int main( ) {

int nums[ ] = {1, 4, 8};

int cont;

for(cont=0; cont < 3; cont++) {

printf(%d\n,*(nums++));

}

}

Declarao de uma constante do tipo ponteiro para inteiros (ponteiro constante)

Tenta incrementar endereo constante nums e atualizar a constante com novo endereo

Errado!

10

Ponteiros Constantes x Ponteiros

Variveis

int main( ) {

int nums[ ] = {1, 4, 8};

int* pnums = nums;

int cont;

for(cont=0; cont < 3; cont++) {

printf(%d\n,*(pnums++));

}

}

Declarao de uma varivel do tipo ponteiro para inteiros (ponteiro varivel)

Incrementa endereo armazenado na varivel pnums e atualiza a varivel com

novo endereo

Certo!

11

int a[10];

int *pa;

pa = a;

Ponteiros Constantes x Ponteiros

Variveis

int a[10];

int *pa;

a = pa;

Atribui a uma varivel um novo

endereo: CERTO!

Atribui a uma constante um novo endereo: ERRADO!

#include

float media(int n, float num[]){

int i;

float s = 0.0;

for(i = 0; i < n; i++)

s = s + num[i] ;

return s/n ;

}

int main(){

float numeros[10] ;

float med;

int i ;

for(i = 0; i < 10; i++)

scanf (%f, &numeros[i]) ;

med = media(10, numeros ) ;

...

}

12

Passando Vetores como Argumentos

para Funes

Parmetro do tipo vetor de float

Endereo inicial do vetor passado como argumento

#include

float media(int n, float* num){

int i;

float s = 0.0;

for(i = 0; i < n; i++)

s = s + num[i] ;

return s/n ;

}

int main(){

float numeros[10] ;

float med;

int i ;

for(i = 0; i < 10; i++)

scanf (%f, &numeros[i]) ;

med = media(10, numeros ) ;

...

}

13

Passando Ponteiros invs de Vetores

como Argumentos para Funes

Parmetro do tipo ponteiro para float

Endereo inicial (ponteiro) do vetor passado como

argumento

14

Passando Ponteiros como

Argumentos de Funes

Considere a seguinte assinatura de funo:

void incrementa(int n, int* v)

Pergunta: Parmetro v um ponteiro para um vetor de inteiros ou para uma varivel do tipo inteiro?

Resposta 1: No tem como saber

Resposta 2: indiferente. Podemos considerar um ponteiro para uma varivel do tipo inteiro como um ponteiro para um vetor com um s elemento

15

Comando sizeof

Forma Geral:

Informa o nmero de bytes de um dado tipo ou varivel

em tempo de compilao

Exemplo:

int d = sizeof(float); d armazena o valor 4

sizeof(tipo) ou sizeof(variavel)

16

Usando sizeof para Determinar

Tamanho de Ponteiros e Vetores

int main() {

int num[ ]={1,2,3};

int numElementos = sizeof(num)/sizeof(int);

printf ("Tamanho = %d\n", sizeof(num));

printf ("Num elementos = %d\n", numElementos);

}

int main() {

int num[ ]={1,2,3};

int* num2 = num;

int numElementos = sizeof(num2)/sizeof(int);

printf ("Tamanho = %d\n", sizeof(num2));

printf ("Num elementos = %d\n", numElementos);

}

Qual o o numero de elementos?

Qual o o numero de elementos?

3

1

17

Alocao de Memria

Quando declaramos uma varivel, o compilador

reserva (aloca) um espao na memria

suficiente para armazenar valores do tipo da

varivel

Alocao esttica (em tempo de compilao)

int var ;

char s1 [10];

char* s2;

Aloca espao para 1 int

Aloca espao para 10 char

Aloca espao para 1 endereo

18

Modos de alocar espao em memria:

Estaticamente

Variveis globais (e estticas): O espao reservado

para a varivel existe enquanto o programa estiver

sendo executado

Variveis locais: O espao existe enquanto a

funo, que declarou a varivel, estiver sendo

executada.

Dinamicamente

Requisitar memria em tempo de execuo: O

espao alocado dinamicamente permanece

reservado at que seja explicitamente liberado

pelo programa

Alocao Dinmica

19

Funo bsica para alocar memria malloc

presente na biblioteca stdlib.h

Recebe como argumento um nmero inteiro sem

sinal que representa a quantidade de bytes que se

deseja alocar

Retorna o endereo inicial da rea de memria

alocada.

Alocao Dinmica em C

void* malloc(unsigned qtdBytes);

20

Aloca somente a quantidade de memria necessria

Exemplo:

Alocao Dinmica em C com malloc

int *v ;

v = malloc (10 * 4) ;

Se a alocao for bem sucedida, v armazenar o endereo inicial de uma rea contnua de memria suficiente para armazenar 10 valores inteiros (4O

bytes)

21

Uso do comando sizeof para ter independncia de

plataforma de desenvolvimento

Exemplo:

int *v ;

v = malloc(10 * sizeof (int)) ;

Funo malloc retorna um ponteiro genrico, para qualquer tipo, representado por *void

Faz-se a converso para o tipo apropriado usando o operador de molde de tipo (cast)

v = (int *) malloc(10 * sizeof(int));

Alocao Dinmica em C com malloc

22

Erro na Alocao

Se no houver espao livre suficiente para realizar a alocao, a funo malloc retorna

um endereo nulo

representado pelo smbolo NULL

uma boa prtica de programao testar se a

alocao foi bem sucedida para evitar erros de

execuo

23

Liberando Espao Alocado

Uso da funo free para liberar espao de

memria alocada dinamicamente

Recebe como parmetro o ponteiro da memria a

ser liberada

O espao de memria fica livre para ser alocado

futuramente pelo prprio programa ou outro

programa

Recomenda-se liberar espao de memria

previamente alocado que no mais necessrio

Evita des