Você está na página 1de 78

Ponteiros

Ponteiros
SCC0202 - Algoritmos e Estruturas de Dados I

Prof. Fernando V. Paulovich


*Baseado no material do Prof. Gustavo Batista

http://www.icmc.usp.br/~paulovic
paulovic@icmc.usp.br
Instituto de Cincias Matemticas e de Computao (ICMC)
Universidade de So Paulo (USP)

22 de julho de 2013

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Sumrio
1

Conceitos Introdutrios sobre Ponteiros

Operaes com Ponteiros

Ponteiros e Matrizes

Ponteiros e Estruturas (structs)

Ponteiros e Alocao de Memria

Ponteiros e Passagem por Referncia de Funes

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Sumrio
1

Conceitos Introdutrios sobre Ponteiros

Operaes com Ponteiros

Ponteiros e Matrizes

Ponteiros e Estruturas (structs)

Ponteiros e Alocao de Memria

Ponteiros e Passagem por Referncia de Funes

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Introduo
O que so ponteiros?
Um ponteiro um endereo de memria

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Introduo
O que so ponteiros?
Um ponteiro um endereo de memria
Indica onde uma varivel est armazenada, no o que
est armazenado

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Introduo
O que so ponteiros?
Um ponteiro um endereo de memria
Indica onde uma varivel est armazenada, no o que
est armazenado
Proporciona um modo de acesso a uma varivel sem
referenci-la

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Introduo
O que so ponteiros?
Um ponteiro um endereo de memria
Indica onde uma varivel est armazenada, no o que
est armazenado
Proporciona um modo de acesso a uma varivel sem
referenci-la

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Introduo
O que so ponteiros?
Um ponteiro um endereo de memria
Indica onde uma varivel est armazenada, no o que
est armazenado
Proporciona um modo de acesso a uma varivel sem
referenci-la

Por que so usados?


Manipular elementos de uma matriz

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Introduo
O que so ponteiros?
Um ponteiro um endereo de memria
Indica onde uma varivel est armazenada, no o que
est armazenado
Proporciona um modo de acesso a uma varivel sem
referenci-la

Por que so usados?


Manipular elementos de uma matriz
Receber argumentos em funes que necessitem modificar
o argumento original

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Introduo
O que so ponteiros?
Um ponteiro um endereo de memria
Indica onde uma varivel est armazenada, no o que
est armazenado
Proporciona um modo de acesso a uma varivel sem
referenci-la

Por que so usados?


Manipular elementos de uma matriz
Receber argumentos em funes que necessitem modificar
o argumento original
Criar estruturas de dados complexas

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Introduo
O que so ponteiros?
Um ponteiro um endereo de memria
Indica onde uma varivel est armazenada, no o que
est armazenado
Proporciona um modo de acesso a uma varivel sem
referenci-la

Por que so usados?


Manipular elementos de uma matriz
Receber argumentos em funes que necessitem modificar
o argumento original
Criar estruturas de dados complexas
etc.

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Ponteiros Constantes e Ponteiros Variveis


Tipos de Ponteiros
Ponteiro constate no pode ter seu valor alterado
(matrizes)

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Ponteiros Constantes e Ponteiros Variveis


Tipos de Ponteiros
Ponteiro constate no pode ter seu valor alterado
(matrizes)
Ponteiro varivel um tipo especial de varivel que
contm o endereo de outra varivel

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Ponteiros Constantes e Ponteiros Variveis


Tipos de Ponteiros
Ponteiro constate no pode ter seu valor alterado
(matrizes)
Ponteiro varivel um tipo especial de varivel que
contm o endereo de outra varivel
Dizemos que uma varivel aponta para outra varivel
quando a primeira contm o endereo da segunda

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Ponteiros Constantes e Ponteiros Variveis


Tipos de Ponteiros
Ponteiro constate no pode ter seu valor alterado
(matrizes)
Ponteiro varivel um tipo especial de varivel que
contm o endereo de outra varivel
Dizemos que uma varivel aponta para outra varivel
quando a primeira contm o endereo da segunda

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Ponteiros Constantes e Ponteiros Variveis


Tipos de Ponteiros
Ponteiro constate no pode ter seu valor alterado
(matrizes)
Ponteiro varivel um tipo especial de varivel que
contm o endereo de outra varivel
Dizemos que uma varivel aponta para outra varivel
quando a primeira contm o endereo da segunda

Observao
Um ponteiro constante um endereo

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Ponteiros Constantes e Ponteiros Variveis


Tipos de Ponteiros
Ponteiro constate no pode ter seu valor alterado
(matrizes)
Ponteiro varivel um tipo especial de varivel que
contm o endereo de outra varivel
Dizemos que uma varivel aponta para outra varivel
quando a primeira contm o endereo da segunda

Observao
Um ponteiro constante um endereo
Um ponteiro varivel um lugar para guardar endereos

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Endereos de Memria e Variveis


Um endereo a referncia que o computador usa para
localizar variveis
Toda varivel ocupa uma certa localizao na memria, e
seu endereo o primeiro byte ocupado por ela

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Endereos de Memria e Variveis


Um endereo a referncia que o computador usa para
localizar variveis
Toda varivel ocupa uma certa localizao na memria, e
seu endereo o primeiro byte ocupado por ela

Inteiro (int) ocupa 2 bytes na memria


Nmero de ponto flutuante (float) ocupa 4 bytes na memria

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Operador de Endereos &


Para conhecer o endereo ocupado por uma varivel
usamos o operador de endereos (&)
1
2
3
4
5
6
7

int main() {
int i, j, k;
printf("Endereo de i -> %u \n", &i);
printf("Endereo de j -> %u \n", &j);
printf("Endereo de k -> %u \n", &k);
return 0;
}

SADA
Endereo de i -> 0xFF4
Endereo de j -> 0xFF2
Endereo de k -> 0xFF0

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Operador de Endereos &


O operador de endereos (&) s pode ser usado com
nomes de variveis.
1
2

&(i+1) //ERRADO
&5 //ERRADO

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Declarando Varivel Ponteiro


Endereos so armazenados de forma semelhante a outras
variveis

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Declarando Varivel Ponteiro


Endereos so armazenados de forma semelhante a outras
variveis
necessrio saber qual o tamanho que ocupa a varivel
apontada por um ponteiro

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Declarando Varivel Ponteiro


Endereos so armazenados de forma semelhante a outras
variveis
necessrio saber qual o tamanho que ocupa a varivel
apontada por um ponteiro
O tipo da varivel apontada (portanto seu tamanho)
fornecido na declarao do ponteiro

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Declarando Varivel Ponteiro


Endereos so armazenados de forma semelhante a outras
variveis
necessrio saber qual o tamanho que ocupa a varivel
apontada por um ponteiro
O tipo da varivel apontada (portanto seu tamanho)
fornecido na declarao do ponteiro

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Declarando Varivel Ponteiro


Endereos so armazenados de forma semelhante a outras
variveis
necessrio saber qual o tamanho que ocupa a varivel
apontada por um ponteiro
O tipo da varivel apontada (portanto seu tamanho)
fornecido na declarao do ponteiro
1

int *px, *py;

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Declarando Varivel Ponteiro


Endereos so armazenados de forma semelhante a outras
variveis
necessrio saber qual o tamanho que ocupa a varivel
apontada por um ponteiro
O tipo da varivel apontada (portanto seu tamanho)
fornecido na declarao do ponteiro
1

int *px, *py;


px e py so ponteiros que armazenam endereos de variveis do tipo int

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Operador Indireto (*)


O operador indireto (*) tem como operando um endereo
e prov acesso ao contedo da varivel localizada em tal
endereo

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Operador Indireto (*)


O operador indireto (*) tem como operando um endereo
e prov acesso ao contedo da varivel localizada em tal
endereo
Prov acesso ao valor da varivel apontada

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Operador Indireto (*)


O operador indireto (*) tem como operando um endereo
e prov acesso ao contedo da varivel localizada em tal
endereo
Prov acesso ao valor da varivel apontada

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Operador Indireto (*)


O operador indireto (*) tem como operando um endereo
e prov acesso ao contedo da varivel localizada em tal
endereo
Prov acesso ao valor da varivel apontada

Ponteiros so sempre inicializados com valor 0 ou NULL

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Operador Indireto (*)


O operador indireto (*) tem como operando um endereo
e prov acesso ao contedo da varivel localizada em tal
endereo
Prov acesso ao valor da varivel apontada

Ponteiros so sempre inicializados com valor 0 ou NULL


C garante que NULL no um endereo vlido

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Operador Indireto (*)


O operador indireto (*) tem como operando um endereo
e prov acesso ao contedo da varivel localizada em tal
endereo
Prov acesso ao valor da varivel apontada

Ponteiros so sempre inicializados com valor 0 ou NULL


C garante que NULL no um endereo vlido
Antes de usar um ponteiro devemos atribuir algum
endereo vlido ele

Ponteiros
Conceitos Introdutrios sobre Ponteiros

Exemplo de Ponteiros
1
2
3

int main() {
int x, y;
int *px, *py;

x = 10;
y = 20;

5
6
7

printf("Valor de x: %d \n", x);


printf("Valor de y: %d \n", y);

8
9
10

px = &x;
py = &y;

11
12
13

printf("Contedo apontado por px: %d \n", *px);


printf("Contedo apontado por py: %d \n", *py);

14
15
16

*px = 3;
*py = 5;

17
18
19

printf("Contedo apontado por px: %d \n", *px);


printf("Contedo apontado por py: %d \n", *py);

20
21
22

printf("Valor de x: %d \n", x);


printf("Valor de y: %d \n", y);

23
24
25

return 0;

26
27

Ponteiros
Operaes com Ponteiros

Sumrio
1

Conceitos Introdutrios sobre Ponteiros

Operaes com Ponteiros

Ponteiros e Matrizes

Ponteiros e Estruturas (structs)

Ponteiros e Alocao de Memria

Ponteiros e Passagem por Referncia de Funes

Ponteiros
Operaes com Ponteiros

Operaes com Ponteiros


A linguagem C oferece cinco operaes bsicas que
podem ser executadas com ponteiros

Ponteiros
Operaes com Ponteiros

Operaes com Ponteiros


A linguagem C oferece cinco operaes bsicas que
podem ser executadas com ponteiros
Soma

Ponteiros
Operaes com Ponteiros

Operaes com Ponteiros


A linguagem C oferece cinco operaes bsicas que
podem ser executadas com ponteiros
Soma
Subtrao

Ponteiros
Operaes com Ponteiros

Operaes com Ponteiros


A linguagem C oferece cinco operaes bsicas que
podem ser executadas com ponteiros
Soma
Subtrao
Operaes lgicas (<,>,==,!=)

Ponteiros
Operaes com Ponteiros

Operaes com Ponteiros


A linguagem C oferece cinco operaes bsicas que
podem ser executadas com ponteiros
Soma
Subtrao
Operaes lgicas (<,>,==,!=)
Operador de dereferncia ou indireto (*)

Ponteiros
Operaes com Ponteiros

Operaes com Ponteiros


A linguagem C oferece cinco operaes bsicas que
podem ser executadas com ponteiros
Soma
Subtrao
Operaes lgicas (<,>,==,!=)
Operador de dereferncia ou indireto (*)
Operador de endereo (&)

Ponteiros
Operaes com Ponteiros

Operaes com Ponteiros


A linguagem C oferece cinco operaes bsicas que
podem ser executadas com ponteiros
Soma
Subtrao
Operaes lgicas (<,>,==,!=)
Operador de dereferncia ou indireto (*)
Operador de endereo (&)

O seguinte programa ilustra tais operaes

Ponteiros
Operaes com Ponteiros

Operaes com Ponteiros


1
2
3

int main() {
int x = 5, y = 6;
int *px, *py;

px = &x;
py = &y;

5
6
7

if ( px < py ) printf("py - px = %u \n", py-px);


else printf("px - py = %u \n", px-py);

8
9
10

printf("px = %u, *px = %d, &px = %u\n", px, *px, &px);


printf("py = %u, *py = %d, &py = %u\n", py, *py, &py);

11
12
13

px++;
printf("px = %u, *px = %d, &px = %u\n", px, *px, &px);

14
15
16

py = px + 3;
printf("py = %u, *py = %d, &py = %u\n", py, *py, &py);
printf("py - px = %u\n", py - px);

17
18
19
20

return 0;

21
22

Ponteiros
Operaes com Ponteiros

Operaes com Ponteiros


SADA
py - px = 1
px = 65488,
py = 65490,
px = 65490,
py = 65496,
py - px = 3

*px
*py
*px
*py

=
=
=
=

5, &px = 65492
6, &py = 65494
6, &px = 65492
-28, &py = 65494

Ponteiros
Operaes com Ponteiros

Precedncia
Como a expresso *lista++ interpretada pelo
compilador?
1
2

*lista++ == *(lista++), ou
*lista++ == (*lista)++

Ponteiros
Operaes com Ponteiros

Precedncia
Como a expresso *lista++ interpretada pelo
compilador?
1
2

*lista++ == *(lista++), ou
*lista++ == (*lista)++

Quando operadores tm a mesma precedncia, como o


caso do operador indireto e do operador de incremento,
eles so resolvidos por associao: da direta para
esquerda ou da esquerda para a direita
Como operadores unrios so resolvidos da direta para a
esquerda, temos que a expresso interpretada como:

Ponteiros
Operaes com Ponteiros

Precedncia
Como a expresso *lista++ interpretada pelo
compilador?
1
2

*lista++ == *(lista++), ou
*lista++ == (*lista)++

Quando operadores tm a mesma precedncia, como o


caso do operador indireto e do operador de incremento,
eles so resolvidos por associao: da direta para
esquerda ou da esquerda para a direita
Como operadores unrios so resolvidos da direta para a
esquerda, temos que a expresso interpretada como:
1

*lista++ == *(lista++)

Ponteiros
Ponteiros e Matrizes

Sumrio
1

Conceitos Introdutrios sobre Ponteiros

Operaes com Ponteiros

Ponteiros e Matrizes

Ponteiros e Estruturas (structs)

Ponteiros e Alocao de Memria

Ponteiros e Passagem por Referncia de Funes

Ponteiros
Ponteiros e Matrizes

Ponteiros e Matrizes
Existe um estreito relacionamento entre Matrizes e
Ponteiros em C de forma que qualquer operao que
possa ser feita com ndice de matrizes pode ser feita com
ponteiros

Ponteiros
Ponteiros e Matrizes

Ponteiros e Matrizes
Existe um estreito relacionamento entre Matrizes e
Ponteiros em C de forma que qualquer operao que
possa ser feita com ndice de matrizes pode ser feita com
ponteiros
O nome de uma matriz um endereo, ou seja, um
ponteiro

Ponteiros
Ponteiros e Matrizes

Ponteiros e Matrizes
Existe um estreito relacionamento entre Matrizes e
Ponteiros em C de forma que qualquer operao que
possa ser feita com ndice de matrizes pode ser feita com
ponteiros
O nome de uma matriz um endereo, ou seja, um
ponteiro
Na verdade o nome da matriz um ponteiro constante

Ponteiros
Ponteiros e Matrizes

Ponteiros e Matrizes
Verso usando notao de matriz
1
2
3
4
5

int main() {
int nums[] = {92,81,70,69,58};
for(int d = 0; d < 5; d++) printf("%d\n", nums[d]);
return 0;
}

Verso usando notao de ponteiros


1
2
3
4
5

int main() {
int nums[] = {92,81,70,69,58};
for(int d = 0; d < 5; d++) printf("%d\n", *(nums+d));
return 0;
}

Ponteiros
Ponteiros e Matrizes

Ponteiros e Matrizes
De forma geral, temos
1

*(nome_matriz + ndice) = nome_matriz[ndice]

Ponteiros
Ponteiros e Matrizes

Ponteiros e Matrizes
O endereo de um elemento de uma matriz pode ser
referenciado de duas formas
em notao ponteiro (nums+d)
em notao de matriz (&nums[d])

Ponteiros
Ponteiros e Matrizes

Ponteiros e Matrizes
O endereo de um elemento de uma matriz pode ser
referenciado de duas formas
em notao ponteiro (nums+d)
em notao de matriz (&nums[d])

Considerando uma matriz de inteiros, no endereo 3000

Ponteiros
Ponteiros e Matrizes

Ponteiros e Matrizes
O endereo de um elemento de uma matriz pode ser
referenciado de duas formas
em notao ponteiro (nums+d)
em notao de matriz (&nums[d])

Considerando uma matriz de inteiros, no endereo 3000


1

int nums[] = {92,81,70,69,58}

2
3
4

&nums[2] == (nums+2) == 3004


nums[2] == *(nums+2) == 70

Ponteiros
Ponteiros e Matrizes

Ponteiros e Matrizes
Considere o seguinte cdigo
1

int vetor[10];

2
3
4
5

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


*(vetor+i) = i;
}

Posso fazer?
1

*(vetor++) = i;

Ponteiros
Ponteiros e Matrizes

Ponteiros e Matrizes
Considere o seguinte cdigo
1

int vetor[10];

2
3
4
5

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


*(vetor+i) = i;
}

Posso fazer?
1

*(vetor++) = i;

Ponteiros
Ponteiros e Matrizes

Ponteiros e Matrizes
Considere o seguinte cdigo
1

int vetor[10];

2
3
4
5

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


*(vetor+i) = i;
}

Posso fazer?
1

*(vetor++) = i;

Erro pois vetor um ponteiro constate, portanto no


pode ser alterado

Ponteiros
Ponteiros e Matrizes

Ponteiros e Matrizes
Observao
No se pode alterar o valor de um ponteiro constante,
somente de um ponteiro varivel

Ponteiros
Ponteiros e Matrizes

Ponteiros para matrizes usando funes


Na funo adconst() a declarao int *ptr
equivalente a int ptr[]
1

int const TAM = 5;

2
3
4
5

void adconst(int *ptr, int num, int con ) {


for (int k = 0; k < num; k++) *(ptr) = *(ptr++) + con;
}

6
7
8
9

int main() {
int matriz[TAM] = {3,5,7,9,11};
int c = 10;

10

adconst(matriz, TAM, c);

11
12

for(int j = 0; j < TAM; j++) printf("%d", *(matriz+j));

13
14

return 0;

15
16

Ponteiros
Ponteiros e Estruturas (structs)

Sumrio
1

Conceitos Introdutrios sobre Ponteiros

Operaes com Ponteiros

Ponteiros e Matrizes

Ponteiros e Estruturas (structs)

Ponteiros e Alocao de Memria

Ponteiros e Passagem por Referncia de Funes

Ponteiros
Ponteiros e Estruturas (structs)

Ponteiros e Estruturas (structs)


Como em qualquer outro tipo, ponteiros para estruturas
podem ser definidos
1
2
3
4

typedef struct ITEM {


int chave;
int valor;
};

5
6
7
8

int main() {
struct ITEM item; //define uma varivel
struct ITEM *pitem; //define um ponteiro

pitem = &item; //ponteiro aponta para varivel

10
11

(*pitem).chave = 1;
(*pitem).valor = 59;

12
13
14

return 0;

15
16

Ponteiros
Ponteiros e Estruturas (structs)

Ponteiros e Estruturas (structs)


Uma notao do tipo (*pitem).chave confusa, de
forma que a linguagem C define um operador adicional
(->) para acessar membros de estruturas atravs de
ponteiros

Ponteiros
Ponteiros e Estruturas (structs)

Ponteiros e Estruturas (structs)


Uma notao do tipo (*pitem).chave confusa, de
forma que a linguagem C define um operador adicional
(->) para acessar membros de estruturas atravs de
ponteiros
O operador -> substitui o operador . no caso da
utilizao de um ponteiro para uma estrutura (struct)

Ponteiros
Ponteiros e Estruturas (structs)

Ponteiros e Estruturas (structs)


Uma notao do tipo (*pitem).chave confusa, de
forma que a linguagem C define um operador adicional
(->) para acessar membros de estruturas atravs de
ponteiros
O operador -> substitui o operador . no caso da
utilizao de um ponteiro para uma estrutura (struct)

Ponteiros
Ponteiros e Estruturas (structs)

Ponteiros e Estruturas (structs)


Uma notao do tipo (*pitem).chave confusa, de
forma que a linguagem C define um operador adicional
(->) para acessar membros de estruturas atravs de
ponteiros
O operador -> substitui o operador . no caso da
utilizao de um ponteiro para uma estrutura (struct)
1
2

pitem->chave = 1; //ao invs de (pitem).chave = 1;


pitem->valor = 59; //ao invs de (pitem).valor = 59;

Ponteiros
Ponteiros e Alocao de Memria

Sumrio
1

Conceitos Introdutrios sobre Ponteiros

Operaes com Ponteiros

Ponteiros e Matrizes

Ponteiros e Estruturas (structs)

Ponteiros e Alocao de Memria

Ponteiros e Passagem por Referncia de Funes

Ponteiros
Ponteiros e Alocao de Memria

Alocao de Memria
possvel alocar memria para a qual um ponteiro
aponta, ao invs de faz-lo apontar para uma varivel

Ponteiros
Ponteiros e Alocao de Memria

Alocao de Memria
possvel alocar memria para a qual um ponteiro
aponta, ao invs de faz-lo apontar para uma varivel
Para tal, uma chamada ao procedimento predefinido
malloc() deve ser feita

Ponteiros
Ponteiros e Alocao de Memria

Alocao de Memria
possvel alocar memria para a qual um ponteiro
aponta, ao invs de faz-lo apontar para uma varivel
Para tal, uma chamada ao procedimento predefinido
malloc() deve ser feita
Uma vez alocada memria, no esquecer de liberar com
free()

Ponteiros
Ponteiros e Alocao de Memria

Alocao de Memria
possvel alocar memria para a qual um ponteiro
aponta, ao invs de faz-lo apontar para uma varivel
Para tal, uma chamada ao procedimento predefinido
malloc() deve ser feita
Uma vez alocada memria, no esquecer de liberar com
free()
Para usar malloc() e free() no esquea de incluir
#include <stdlib.h>

Ponteiros
Ponteiros e Alocao de Memria

Alocao de Memria
1
2
3
4

typedef struct ITEM {


int chave;
int valor;
};

5
6
7

//aloca memria para um ITEM


struct ITEM *n = (struct ITEM *)malloc(sizeof(struct ITEM))

8
9
10

//libera memria alocada


free(n);

Ponteiros
Ponteiros e Alocao de Memria

Alocao de Memria
1
2
3
4

typedef struct ITEM {


int chave;
int valor;
};

5
6
7

//aloca memria para um ITEM


struct ITEM *n = (struct ITEM *)malloc(sizeof(struct ITEM))

8
9
10

//libera memria alocada


free(n);

Uma chamada a malloc() faz duas tarefas


Cria uma varivel dinmica do tipo que n ponta, em uma
rea de memria chamada heap
Faz com que n aponte para essa varivel dinmica recm
criada

Ponteiros
Ponteiros e Passagem por Referncia de Funes

Sumrio
1

Conceitos Introdutrios sobre Ponteiros

Operaes com Ponteiros

Ponteiros e Matrizes

Ponteiros e Estruturas (structs)

Ponteiros e Alocao de Memria

Ponteiros e Passagem por Referncia de Funes

Ponteiros
Ponteiros e Passagem por Referncia de Funes

Passagem de Parmetros
Argumentos em C so passados para funes usando
Chamada por Valor
feito uma cpia dos argumentos passados para serem
usados dentro da funo

Isso pode causar duas restries


Memria e tempo de processamento extra so
necessrios para realizar essa cpia
Alteraes aos argumentos so feitos localmente, no so
visveis fora da funo

Ponteiros
Ponteiros e Passagem por Referncia de Funes

Passagem de Parmetros
Ponteiros podem ser usados para que seja possvel acessar
os argumentos originais passados
Possibilita retornar valores nos argumentos das funes
Evita cpia de argumentos muito grandes (p.ex. structs)

Esse tipo de chamada conhecido como Chamada por


Referncia
Na verdade ainda so feito cpias dos ponteiros, mas
essas indicam os endereos dos argumentos originais

Ponteiros
Ponteiros e Passagem por Referncia de Funes

Passagem de Parmetros
1
2
3
4

void altera(int *px, int *py) {


*px = *px + 3;
*py = *py + 5;
}

5
6
7

int main() {
int x, y;

x = 10;
y = 20;

9
10
11

printf("X = %d, Y = %d", x, y);

12
13

altera(&x, &y);

14
15

printf("X = %d, Y = %d", x, y);

16
17

return 0;

18
19