Programação Aula 20 - Ponteiros · 2 Expresso˜es Passagem de parˆametros Referˆencias...

64
Programa¸ ao Aula 20 - Ponteiros Prof. Laura Silva de Assis Engenharia de Computa¸c˜ ao 2 o Per´ ıodo CEFET/RJ - Centro Federal de Educa¸c˜ ao Tecnol´ ogica Celso Suckow da Fonseca UnED Petr´ opolis 2 o semestre - 2015

Transcript of Programação Aula 20 - Ponteiros · 2 Expresso˜es Passagem de parˆametros Referˆencias...

ProgramacaoAula 20 - Ponteiros

Prof. Laura Silva de Assis

Engenharia de Computacao2o Perıodo

CEFET/RJ - Centro Federal de Educacao Tecnologica Celso Suckow daFonseca

UnED Petropolis

2o semestre - 2015

1

ExpressoesPassagem de parametros

Referencias

Sumario

1 Expressoes

2 Passagem de parametros

3 Referencias

2

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Atribuicao

Em geral, expressoes envolvendo ponteiros concordam com asmesmas regras de qualquer outra expressao em C;

Como ocorre com qualquer variavel um ponteiro pode ser usado dolado direito de uma atribuicao para passar seu valor para um outroponteiro.

#i n c l u d e <s t d i o . h>vo i d main ( ) {

i n t x ;i n t ∗p1 , ∗p2 ;

p1 = &x ;p2 = p1 ;p r i n t f ( ”v a l o r de x = %d \ t \ t e nde r e c o de x = %p\n ” , x , &x ) ;p r i n t f ( ”v a l o r de x = %d \ t \ t e nde r e c o apontado por p1 = %p\n ” , x , p1 ) ;p r i n t f ( ”Endereco apontado por p2 = %p\n ” , p2 ) ;

}

Tanto p1 quanto p2 apontam para x.

3

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Atribuicao

#i n c l u d e <s t d i o . h>vo i d main ( ) {

i n t x ;i n t ∗p1 , ∗p2 ;

p1 = &x ;p2 = p1 ;

p r i n t f ( ”v a l o r de x = %d \ t \ t e nde r e c o de x = %p\n ” , x , p2 ) ;p r i n t f ( ”v a l o r de x = %d \ t \ t e nde r e c o apontado por p1 = %p\n ” , x , p1 ) ;p r i n t f ( ”Endereco apontado por p2 = %p\n ” , p2 ) ;

}

O modificador de formato da funcao printf(), %p, faz com que afuncao apresente um endereco no formato do computador.

Resultado da execucao

v a l o r de x = 0 ende r e c o de x = 0 x7 f f f e 4 82 e 7d cv a l o r de x = 0 ende r e c o apontado por p1 = 0 x7 f f f e 4 82 e 7d cEndereco apontado por p2 = 0 x7 f f f e 4 82 e 7d c

4

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Aritmetica

Existem duas operacoes aritmeticas que podem ser usadaliteralmente com ponteiros: adicao e subtracao;

Considerando as instrucoes a seguir e o armazenamento de inteiroscom 2 bytes:

#i n c l u d e <s t d i o . h>vo i d main ( ) {

i n t x = 20 ; // cons i de r ando x armazenado na memo r i a 2000i n t ∗p1 = &x ;p1++;

}

Apos a instrucao p1++, p1 contem 2002 e nao 2001;

Cada vez que p1 e incrementado ele aponta para o proximo inteiro(o mesmo acontece com o decremento).

5

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Aritmetica - Incremento

Um ponteiro pode ser incrementado como qualquer variavel;

O incremento em um ponteiro (ptr) para um determinado tipo,significa que o novo endereco do ponteiro e seu endereco anterior +sizeof(tipo);

Entao o ponteiro nao avanca um byte, mas sim a dimensao do tipodo objeto para o qual ele aponta.

6

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Aritmetica - Incremento

Um ponteiro para o tipo xyz avanca sempre sizeof(xyz) bytes porunidade de incremento;

Na operacao de incremento, podem-se utilizar os operadoresnormais:

p t r++;p t r = p t r + 2 ;p t r += 4;

. . .

f o r ( i =0; i<n ; i++)p t r +=i ;

7

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Aritmetica - Incremento

Exemplo:

#i n c l u d e <s t d i o . h>

vo i d main ( ) {i n t x=5;i n t ∗px = &x ;f l o a t y=5.0;f l o a t ∗py = &y ;

p r i n t f ( ”%d %l d \n ” , x , ( l ong ) px ) ;p r i n t f ( ”%d %l d \n ” , x+1, ( l ong ) ( px+1) ) ;p r i n t f ( ”%f %l d \n ” , y , ( l ong ) py ) ;p r i n t f ( ”%f %l d \n ” , y+1, ( l ong ) ( py+1) ) ;

}

5 1407336801873846 1407336801873865.000000 1407336801873886.000000 140733680187392

8

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Aritmetica

Considerando as declaracoes:

char ∗ch = 3000;i n t ∗ i = 3000;

9

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Aritmetica - Decremento

O decremento de ponteiros pode ser utilizado da mesma forma queo incremento;

Um (ponteiro ) para o tipo xyz recua sempre sizeof(xyz) bytes porunidade de decremento.

Exemplo: Programa que mostra uma string na tela na formanormal e inversa.

#i n c l u d e <s t d i o . h>i n t main ( ) {

char s [ 1 0 0 ] ;char ∗p t r = s ;

p r i n t f ( ” I n s i r a uma s t r i n g \n ”) ;g e t s ( s ) ;i f (∗ p t r == ’ \0 ’ )

r e tu r n ( 0) ;pu t cha r ( ’ \n ’ ) ;

// cont i nua . . .

10

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Aritmetica - Decremento

Exemplo: Programa que mostra uma string na tela na formanormal e inversa

// cont i nuac ao . . .

// Impr im i r normalmentewh i l e (∗ p t r != ’ \0 ’ )

put cha r (∗ p t r++) ;put cha r ( ’ \n ’ ) ;

// Impr im i r a s t r i n g ao cont r a r i optr−−;wh i l e ( p t r >= s )

putcha r (∗ ptr−−);pu t cha r ( ’ \n ’ ) ;

}

I n s i r a uma s t r i n gprograma c ao I

programa c ao II o a c amargorp

11

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Aritmetica geral

Generalizando

Cada vez que um ponteiro e incrementado ele aponta para a posicaode memoria do proximo elemento do seu tipo base (decremento →

elemento anterior);

Logo, quando um ponteiro de caracter e incrementado seu valoraumenta em 1, porem quando um ponteiro de inteiro eincrementado seu valor aumenta em dois;

Toda aritmetica de ponteiro e feita relativamente ao tipo de base doponteiro.

12

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Aritmetica - Soma e subtracao

Pode-se somar e subtrair ponteiros:

i n t ∗p1 ;. . .

p1 += 12;

A expressao acima faz p1 apontar para o decimo segundo elementointeiro adiante do elemento que p1 aponta atualmente;

Alem dessas operacoes nenhuma outra aritmetica pode ser efetuadacom ponteiros (nao podemos dividir ou multiplicar).

13

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Aritmetica - Soma e subtracao

A operacao de subtracao entre dois ponteiros para elementos domesmo tipo permite saber quantos elementos existem entre umendereco e outro;

A diferenca entre ponteiros so pode ser realizada entre ponteiros domesmo tipo.

#i n c l u d e <s t d i o . h>

i n t s t r l e n 1 ( char ∗s ) {char ∗ p t r = s ;wh i l e (∗ s != ’ \0 ’ )

s++;r e tu r n ( i n t ) ( s−p t r ) ;

}

vo i d main ( ) {char s [ 1 0 0 ] ;char ∗ p t r = s ;p r i n t f ( ”I n t r o du z a uma s t r i n g \n ”) ;g e t s ( s ) ;p r i n t f ( ”%d\n ” , s t r l e n 1 ( s ) ) ;

}

14

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Comparacao de ponteiros

A comparacao, como qualquer outra variavel, tambem pode ser feitacom ponteiros;

i n t ∗p1 , p2 ;. . .// v e r i f i c a s e p1 e p2 apontam para o mesmo ende r e c oi f ( p1 == p2 )

// v e r i f i c a s e p1 aponta para NULLi f ( p1 == NUL)

15

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Comparacao de ponteiros

E possıvel comparar dois ponteiros (para o mesmo tipo) em umaexpressao relacional;

i n t ∗p , ∗q ;. . .

i f ( p < q )p r i n t f ( ”p aponta para uma memo r i a mais ba i xa que q ”) ;

e l s e i f ( p = = q)p r i n t f ( ”p aponta para a mesma po s i c a o de memo r i a que q ”) ;

e l s ep r i n t f ( ”p aponta para uma memo r i a mais a l t a que q ”) ;

Geralmente, a comparacao de ponteiros e utilizada quando dois oumais ponteiros apontam para um objeto comum;

Pode-se utilizar qualquer operador <,<=, >,>=,== e ! =.

16

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Comparacao de ponteiros

Exemplo:

Uma pilha e uma lista de dados em que o ultimo elemento a entrare o primeiro a sair - LIFO (pillha de pratos);

As pilhas sao frequentemente usadas em compiladores, planilhas, etc(softwares relacionados com o sistema);

Para criar uma pilha sao necessarias basicamente duas funcoes:push() e pop();

push() insere elementos na pilha e pop() remove elementos damesma.

17

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Comparacao de ponteiros

Exemplo:

#i n c l u d e <s t d i o . h>#i n c l u d e < s t d l i b . h>#de f i n e SIZE 50// Var i a v e i s g l o b a i si n t ∗topo , ∗p1 , s t ac k [ SIZE ] ;

// funcao para i n s e r i r na p i l h avo i d push ( i n t num) {

p1++;i f ( p1 = = topo+SIZE ) {

p r i n t f ( ”E s tou ro da p i l h a \n ”) ;e x i t ( 1 ) ;

}∗p1 = num ;

}

// funcao para remove r da p i l h ai n t pop ( ) {

i f ( p1 = = topo ){p r i n t f ( ”P i l h a v a z i a !\ n ”) ;e x i t ( 1 ) ;

}p1−−;r e tu r n ∗(p1+1) ;

}// cont i nua . . .

18

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Comparacao de ponteiros

Exemplo:

// cont i nuac ao . . .

vo i d main ( ) {i n t v a l u e ;

topo = stac k ;p1 = stac k ;

do{p r i n t f ( ”D i g i t e um v a l o r \n ”) ;s c an f ( ”%d ” , &va l u e ) ;i f ( v a l u e != 0)

push ( v a l u e ) ;e l s e

p r i n t f ( ”Elemento de semp i l hado : %d\n ” , pop ( ) ) ;}wh i l e ( v a l u e != −1) ;

}

19

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Comparacao de ponteiros

Resultado da execucao:

D i g i t e um v a l o r5D i g i t e um v a l o r3D i g i t e um v a l o r56D i g i t e um v a l o r2D i g i t e um v a l o r0Elemento de semp i l hado : 2D i g i t e um v a l o r−56D i g i t e um v a l o r0Elemento de semp i l hado : −56D i g i t e um v a l o r−1

20

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

O nome de um vetor corresponde ao endereco de seu primeiroelemento;

i n t ve t [ 1 0 ] ;

ve t = = &ve t [ 0 ]

Logo, o nome de um vetor e um ponteiro para o primeiro elementodesse vetor, porem e um ponteiro constante associado a sua propriamemoria;

Exemplo:

. . .i n t v [ 3 ] = {10 , 20 , 30} ;i n t ∗p t r ;

p t r = v ; //mesmo que p t r = &v [ 0 ]p r i n t f ( ”%d %d\n ” , v [ 0 ] ,∗ p t r ) ; // sa ı da 10 10p t r = &v [ 2 ] ;p r i n t f ( ”%d %d\n ” , v [ 2 ] ,∗ p t r ) ; // sa ı da 30 30

21

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Ponteiros e vetores acesso aos elementos

O C fornece dois metodos para acessar elementos de uma matriz:aritmetica de ponteiros e indexacao de matrizes;

Exemplo:

char s [ ] = ”O l aO l eO l i ” ;char ∗ p t r = s ;

Como pode ser feito o acesso ao caracter ’a’?;

s[2] - Acesso ao ındice 2 do vetor de caracteres;

22

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Ponteiros e vetores acesso aos elementos

O C fornece dois metodos para acessar elementos de uma matriz:aritmetica de ponteiros e indexacao de matrizes;

Exemplo:

char s [ ] = ”O l aO l eO l i ” ;char ∗ p t r = s ;

*(ptr+2) - Acesso a posicao de memoria onde ptr apontaadicionado a 2 posicoes a frente;

*(s+2) - Como s aponta para a primeira posicao do vetor sadicionando 2 temos a terceira posicao;

23

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Ponteiros e vetores acesso aos elementos

char s [ ] = ”O l aO l eO l i ” ;char ∗ p t r = s ;

ptr[2] - O enderecamento de elementos atraves de colchetes podeser realizados tambem por ponteiros, como se tratasse de um vetor.

Se vet for um vetor ja declarado, entao:

ve t [ 0 ] = = ∗( ve t )ve t [ 1 ] = = ∗( ve t+1)ve t [ 2 ] = = ∗( ve t+2). . .v e t [ n ] = = ∗( ve t+n )

24

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Matriz de ponteiros

Ponteiros podem ser organizados em matrizes como qualquer outrotipo de dados;

i n t ∗x [ 1 0 ] ;

Para atribuir o endereco de uma variavel inteira, chamada var, aoterceiro elemento da matriz de ponteiro, faz-se:

x [ 2 ] = &var ;

Para obter o valor de var escreve-se;

∗x [ 2 ] ;

25

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Matriz de ponteiros

Se for necessario passar uma matriz de ponteiros para uma funcao,pode ser usado o mesmo metodo que e utilizado para passar outrasmatrizes;

Chame a funcao com o nome da matriz sem qualquer ındice;

vo i d d i s p l a y a r r a y ( i n t ∗q [ ] ) {i n t t ;f o r ( t=0; t < 10 ; t++)

p r i n t f ( ”%d ” , ∗q [ t ] ) ;}

O parametro q precisa ser declarado como uma matriz de ponteirospara inteiros;

Matrizes de ponteiros sao normalmente usadas como ponteiros parastrings.

26

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Ponteiros de ponteiros

Quando desejamos armazenar o endereco de uma variavel bastadeclara um ponteiro com o operador * e atribuir o endereco de umavariavel ao ponteiro com o operador &;

Se desejarmos armazenar o endreco de um ponteiro, declaramos umponteiro para o tipo da variavel;

i n t x ;i n t ∗p t r x ;i n t ∗∗ p t r p t r x ;

27

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Ponteiros de ponteiros

Pode-se ter um ponteiro apontando para outro ponteiro, o qualaponta para o valor final. Essa situacao e chamada de indirecaomultipla, ou ponteiros para ponteiros;

Quando se tem um ponteiro para ponteiro, o primeiro ponteirocontem o endereco para o segundo ponteiro, o qual aponta para avariavel que contem o valor desejado;

28

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Ponteiros de ponteiros

A indirecao multipla pode ser realizada com qualquer dimensao,porem dificilmente e necessario mais que um ponteiro para ponteiro;

Indirecao excessiva e difıcil de seguir e propensa a erros conceituais;

Uma variavel que e um ponteiro para ponteiro deve ser declaradacomo tal, para isso deve-se colocar um * adicional na frente donome da variavel;

f l o a t ∗∗notas ;

A variavel nota nao e um ponteiro para um ponto flutuante e simum ponteiro para um ponteiro float.

29

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Ponteiros de ponteiros

Para acessar o valor final apontado indiretamente por um ponteiro aum ponteiro, deve-se utilizar o operador * duas vezes.

#i n c l u d e <s t d i o . h>vo i d main ( ) {

i n t x , ∗p , ∗∗q ;

x = 10 ;p = &x ;q = &p ;p r i n t f ( ”\n x = %d \n\n ” , ∗∗q ) ; // impr ime o v a l o r de x , ou se j a , x = 10

}

Resultado:

x = 10

30

ExpressoesPassagem de parametros

Referencias

Expressoes com ponteirosPonteiros e vetoresMatriz de ponteirosIndirecao multipla

Ponteiros de ponteiros

Para acessar o valor final apontado indiretamente por um ponteiro aum ponteiro, deve-se utilizar o operador * duas vezes.

#i n c l u d e <s t d i o . h>vo i d main ( ) {

i n t x , ∗pt r x , ∗∗ p t r p t r x ;x = 5 ;

p t r x = &x ;p t r p t r x = &p t r x ;p r i n t f ( ”x = %d − &x = %l d \n ” , x , ( l ong )&x ) ;p r i n t f ( ”x = %d − &x = %l d \n ” , ∗pt r x , ( l ong ) p t r x ) ;p r i n t f ( ”x = %d − &x = %l d \n ” , ∗∗ p t r p t r x , ( l ong )∗ p t r p t r x ) ;

}

Resultado:

x = 5 − &x = 140733230391132x = 5 − &x = 140733230391132x = 5 − &x = 140733230391132

31

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametro

Revisando...

Uma funcao e composta por 4 partes distintas:

Nome da funcao;

Tipo do retorno;

Lista de parametros;

Corpo da funcao.

32

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametro

Exemplo

i n t Maior ( i n t a , i n t b ) {r e tu r n ( a > b ) ? a : b ;

}

Nome da funcao Maior.Tipo de retorno int.Lista de parametros int a, int b.Corpo da funcao return (a > b) ? a : b;.

Depois que uma funcao e escrita, esta e invocada atraves do seu nome,

seguido do conjunto de argumentos colocados entre parenteses.

33

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Tipo de retorno

Uma funcao possui apenas um tipo de retorno ou nenhum (void);

Caso seja necessario obter da funcao mais de um valor (apos seuprocessamento) temos um problema;

Exemplo: Funcao que calcula quantos elementos de um vetor defloat sao menor que zero e ainda retorne o menor deles;

O numero de elementos de um vetor e armazenado em um int e omenor dos elementos e armazenado em uma variavel do tipo float.Qual devera entao ser o tipo de retorno da funcao?

Para resolver esse problema passa-se as variaveis destinatarias dosresultados para a propria funcao, de forma que seja a propria funcaoque carregue os resultados nas variaveis.

34

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Exemplo - Troca de valores

Uma das operacoes que realizamos com maior frequencia e a trocade valores entre variaveis;

Por exemplo, a ordenacao de um vetor e realizada atraves de trocassucessivas de elementos ate que todos eles se apresentem de acordocom uma determinada ordem;

Uma troca se realiza em 3 passos e necessita sempre de umavariavel auxiliar do tipo dos elementos a serem trocados;

Os elementos a serem trocados deveriam ser enviados para a funcaoque realizara a troca.

35

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Exemplo - Troca de valores

#i n c l u d e <s t d i o . h>

vo i d t r o c a ( i n t a , i n t b ) {i n t tmp ;tmp = a ;a = b ;b = tmp ;

}

vo i d main ( ) {i n t n , k ;

p r i n t f ( ” I n s i r a d o i s numeros i n t e i r o s \n ”) ;s c an f ( ”%d %d ”,&n , &k ) ;p r i n t f ( ”\nAntes da t r o c a : \n n = %d \ t k = %d\n ” , n , k ) ;t r o c a (n , k ) ;p r i n t f ( ”\nDepoi s da t r o c a : \n n = %d \ t k = %d\n ” , n , k ) ;

}

36

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Exemplo - Troca de valores

Resultado da execucao

I n s i r a d o i s numeros i n t e i r o s2 5

Antes da t r o c a :n = 2 k = 5

Depoi s da t r o c a :n = 2 k = 5

Nota

Nenhum dos elementos foi trocado, cada variavel ficou exatamente com ovalor existente antes da chamada da funcao troca.

37

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros - Declaracao das variaveis e atribuicao de valores

Sempre que enviamos argumentos para uma funcao, estes tem queser armazenados em memoria unicamente durante a execucao dafuncao, sendo depois eliminados;

Exemplo: programa troca de inteiros;

38

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros - Chamada da funcao

Sempre que uma funcao e invocada e criado um ambiente proprioonde e feito a criacao das variaveis necessarias a execucao do codigodessa funcao;

E como se fosse criada uma barreira que cortasse a ligacao com oresto do programa que a invocou;

Em seguida e alocado espaco para os parametros da funcao, que saoautomaticamente iniciados com os valores que lhe foram enviadospelo programa invocador.

39

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros - Chamada da funcao

vo i d t r o c a ( i n t a , i n t b ). . .t r o c a (n , k ) ;

40

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros - Chamada da funcao

Em seguida e realizado a alocacao de espaco para as variaveis locaisa funcao, as quais, se nao forem inicializadas pelo programador,armazenam inicialmente um lixo de memoria.

i n t tmp ;

41

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros - Chamada da funcao

Logo apos sao executadas as tres atribuicoes que fazem parte dafuncao troca.

tmp = a ;a = b ;b = tmp ;

42

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros - Chamada da funcao

Como pode-se ver na memoria os valores das variaveis a e b estaotrocados;

Apos a execucao do codigo da funcao, o ambiente associado a ela edestruıdo, voltando o controle da execucao para o programa que ainvocou.

43

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros

Notas

Depois de ter terminado uma funcao, todo o ambiente em que estae executado e eliminado;

Os valores das variaveis originais permanecem inalterados, pois atroca nao foi feita com o valor das variaveis e sim com a copiadesses valores.

44

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros por valor

Sempre que a passgem de parametro e realizada por valor, nao e avariavel que e enviada a funcao, mas sim uma copia do seu valor;

Sendo assim, dentro da funcao pode-se alterar esses valoresrecebidos como parametros que, o valor original das variaveis naosofrera qualquer alteracao, pois sao copias dos valores originais;

Uma vez que a execucao da funcao e encerrada, o programacontinua a execucao com os valores originais das variaveisinvocadoras.

Nota

Numa passagem de parametro por valor, sao sempre enviadas para afuncao copias dos valores de que esta necessita. Os valores das variaveisde invocacao NUNCA sao alterados.

45

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros por referencia

Na passagem de parametros por referencia o que e enviado para afuncao e a propia variavel, ou seja a referencia a ela, e nao umacopia do seu valor;

Dessa forma, qualquer alteracao nos parametros da funcao, narealidade, ocorre uma alteracao nas variaveis referenciadas nachamada da funcao.

46

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros por referencia

A passagem de parametros por referencia e realizada em Cutilizando ponteiros;

Como em C nunca se consegue alterar os argumentos passados auma funcao, pode-se passar o endereco da variavel usando ooperador &;

Se o argumento sera um endereco entao o parametro do cabecalhoda funcao deve ser um ponteiro para o tipo passado;

47

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros por referencia

A invocacao da funcao troca sera realizada com o endereco dasvariaveis e NAO com o seu valor;

t r o c a (&n , &k ) ;

O cabecalho da funcao troca passara a receber, como parametro,dois ponteiros para inteiros;

vo i d t r o c a ( i n t ∗a , i n t ∗b )

48

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros por referencia

Situacao da memoria quando a funcao e executada

49

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros por referencia

O objetivo da funcao agora nao e trocar os valores das variaveis a eb e sim o que essas variaveis apontam (n, k);

De qualquer forma em toda troca precisa-se utilizar uma variavelauxiliar;

Passo a passo da troca:

tmp = ∗a ;

50

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros por referencia

Estando o valor original de n ja armazenado em tmp, podemoscolocar no seu local o valor de k sem perda de dados;

Como so temos acesso as variaveis a e b para conseguir referenciaras posicoes de memoria abaixo da linha delimitadora da funcao.

∗a = ∗b ;

51

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros por referencia

Por ultimo basta colocar em k o valor armazenado na variavelauxiliar;

∗b = tmp ;

52

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros por referencia

Quando a funcao termina, toda a memoria utilizada na execucao eeliminada e n e k estao com os valores trocados como desejado;

53

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros por referencia

Exemplo: Programa da torca completo com passagem por referen-cia.

#i n c l u d e <s t d i o . h>

vo i d t r o c a ( i n t ∗a , i n t ∗b ) {i n t tmp ;tmp = ∗a ;∗a = ∗b ;∗b = tmp ;

}

vo i d main ( ) {i n t n , k ;p r i n t f ( ” I n s i r a d o i s numeros i n t e i r o s \n ”) ;s c an f ( ”%d %d ”,&n , &k ) ;p r i n t f ( ”\nAntes da t r o c a n = %d e k = %d\n ” , n , k ) ;t r o c a (&m, &k ) ;p r i n t f ( ”Depoi s da t r o c a n = %d e k = %d\n ” , n , k ) ;

}

54

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametros por referencia

Exemplo: Programa da torca completo com passagem por referen-cia.

Resultado

I n s i r a d o i s numeros i n t e i r o s2 4

Antes da t r o c a n = 2 e k = 4Depoi s da t r o c a n = 4 e k = 2

Nota

Note que a variavel tmp continua sendo inteira, pois seu objetivo earmazenar um dos inteiros para que o valor nao se perca.

55

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametro na linha de comando

Em C e possıvel fazer a passagem de argumentos para programasvia linha de comando;

Pergunta: Quem e o destinatario dos argumentos passados na linhade comando?

Resposta: O proprio programa!

Para realizar a passagem de parametros, para o main() atraves dalinha de comando, basta digitar o nome do programa seguido dalista de argumentos.

. / nome do prog < l i s t a d e a r gume n t o s>

56

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametro na linha de comando

Internamente, o programa recebera os argumentos em um vetor destrings;

Para tal, sao necessarios especificar dois parametros especiais nafuncao principal do programa:

main ( i n t argc , char ∗a rgv [ ] )

argc: E um inteiro que indica quantos argumentos foram passadosna linha de comando (incluindo o proprio nome do programa);

argv: Vetor contendo todas as strings passadas na linha decomando.

57

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametro na linha de comando

Notas

O parametro argv e um vetor pois foi declarado como argv[] e oselementos que armazena sao do tipo char *, portanto e um vetor destrings.

argv tambem pode ser declarado como sendo do tipo char **argv(ponteiro duplo para char) dado que o nome de um vetor e oendereco do seu primeiro elemento.

58

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametro na linha de comando

Exemplo:

. / prog . e a l f a 123 x 55 ,4

Valor de argc sera 5;

O vetor argv ira conter as strings passadas na linha de comando etodos os parametros sao armazenados como strings.

59

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametro na linha de comando

Exemplo 1: Programa que mostra todos os parametros recebidos na linhade comando.

#i n c l u d e <s t d i o . h>

main ( i n t argc , char ∗a rgv [ ] ) {i n t i ;

f o r ( i =0; i<a rgc ; i++)p r i n t f ( ”%d − P a r m e t r o = \”% s \” \n ” , i +1, a rgv [ i ] ) ;

}

60

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametro na linha de comando

Resultado execucao: Programa que mostra todos os parametros rece-bidos na linha de comando.

// p r im e i r a execu c ao

. / pa rame t ros . e1 − P a r m e t r o = ”. / pa rame t ros . e ”

// segunda execu c a o

. / pa rame t ros . e a l f a 123 x 551 − P a r m e t r o = ”. / pa rame t ros . e ”2 − P a r m e t r o = ”a l f a ”3 − P a r m e t r o = ”123 ”4 − P a r m e t r o = ”x ”5 − P a r m e t r o = ”55 ”

61

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametro na linha de comando

Exemplo 2: Programa que soma todos os numeros passados na linha decomando.

#i n c l u d e <s t d i o . h>#i n c l u d e < s t d l i b . h>

vo i d main ( i n t argc , char ∗a rgv [ ] ) {i n t i , t o t a l ;

p r i n t f ( ”\ n P a r m e t r o s \n ”) ;f o r ( i =1, t o t a l =0; i<a rgc ; i++){

t o t a l += a t o i ( a rgv [ i ] ) ;p r i n t f ( ”%s ” , a rgv [ i ] ) ;

}p r i n t f ( ”\nSoma = %d \n ” , t o t a l ) ;

}

Resultado execucao

. / soma . e 4 1 0 −3 5

P a r m e t r o s4 1 0 −3 5Soma = 7

62

ExpressoesPassagem de parametros

Referencias

IntroducaoTipos de passagem de parametrosPassagem de parametro por valorPassagem de parametro por referenciaLinha de comando

Passagem de parametro na linha de comando

Exemplo 3: Programa que soma todos os numeros passados na linha decomando (ponteiro).

#i n c l u d e <s t d i o . h>#i n c l u d e < s t d l i b . h>

vo i d main ( i n t argc , char ∗∗a rgv ){i n t i , t o t a l ;p r i n t f ( ”\ n P a r m e t r o s \n ”) ;a rgv++;f o r ( t o t a l =0; ∗a rgv !=NULL ; a rgv++){

t o t a l += a t o i (∗ a rgv ) ;p r i n t f ( ”%s ” , ∗a rgv ) ;

}p r i n t f ( ”\n\nSoma = %d \n ” , t o t a l ) ;

}

Resultado execucao

. / soma2 . e 1 2 3

P a r m e t r o s1 2 3Soma = 6

63

ExpressoesPassagem de parametros

Referencias

Referencias

1 C Completo e Total, Herbert Schidt; Pearson Makron Books;3a. Ed., 1997.

2 Linguagem C, Luıs Damas, LTC, 10a. Ed.2014.