ponteiros - uspwiki.icmc.usp.br/images/9/9a/ssc0304-2016-01_aula_11.pdf · ponteiros (pi*pf, pi/pf)...

21
Ponteiros Introdução à Ciência da Computação I

Upload: others

Post on 21-Sep-2020

12 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

Ponteiros

IntroduçãoàCiênciadaComputaçãoI

Page 2: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

Memória

Page 3: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

int main () { int x; x = 10; return 0; }

Memória

16

01234567891011121314151617181920

x

int y = x + 6; printf(“%d”, x);

scanf(“%d”, &x );

y

10

Page 4: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

EndereçodeMemória

•  Ooperador“&”quandoaplicadosobreumidenLficador(nomedevariável,porexemplo)retornaoseuendereço

Page 5: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

Memória01234567891011121314151617181920

scanf(“%d”, &x );

x

Page 6: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

Ponteiros

•  Umponteiroéumavariávelquecontém(armazena)umendereçodememória

•  Declaração:%po_dado*nome_ponteiro;

onde"*"indicaqueavariáveléumponteiro

•  Ex: intx; int*px;/*compiladorsabequepxéponteiro*/

/*pxéumponteiroparainteiro*/

Page 7: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

Oqueéumponteiro?

4

01234567891011121314151617181920

int x = 10, *pi; pi = &x; printf("&x: %p pi: %p", &x, pi);

x pi

10

Saídaemtela: &x:0x4pi:0x4

Page 8: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

Comousarumponteiro?

10

4

01234567891011121314151617181920

int x = 10, *pi, y; pi = &x; y = *pi;

x pi

10

y

O operador “*” quando aplicado sobre um ponteiro retorna o dado apontado

Page 9: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

ULlizandoPonteiros#include <stdio.h> int main() { int x = 10; int *pi;

pi = &x; /* *pi é igual a 10 */ (*pi)++; /* *pi é igual a 11 */ printf("%d" , x);

return 0; }

aoalterar*piestamosalterandooconteúdodex

Page 10: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

ULlizandoPonteiros#include <stdio.h> int main() { int x = 10; int *pi, *pj;

pi = &x; /* *pi == 10 */ pj = pi; /* *pj == 10 */ (*pi)++; /* (*pi, *pj, x) == 11 */ (*pj)++; /* (*pi, *pj, x) == 12 */ printf("%d", x); /* Escreverá 12 */

return 0; }

Page 11: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

PONTEIROS&ARRAYS

Page 12: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

ReferenciandoArrays

•  Pode-sereferenciaroselementosdeumarrayatravésdeponteiros

•  Ex:floatm[]={1.0,3.0,5.75,2.345}; float*pf; pf=&m[2]; prinj("%f",*pf);/*Escreve5.75*/

Page 13: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

ReferenciandoElementos

•  Pode-seuLlizarponteirosecolchetes:floatm[]={1.0,3.0,5.75,2.345};float*pf;pf=&m[2];prinj("%f",pf[0]); /*==>5.75*/

•  NotequeovalorentrecolcheteséodeslocamentoaserconsideradoaparLrdoendereçodereferência•  pf[n]=>indican-ésimoelementoaparLrdepf

Page 14: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

PONTEIROS&PARÂMETROSDEFUNÇÕES

Page 15: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

PassagemdeInformações

•  Argumentospassadosporreferência– Quandochamada,afunçãopassaareferenciar(apontar)avariávelinformada

– Portantooprocessoconsisteeminformaroendereçodavariávelparaoqueoparâmetroformalpossareferenciá-lo.

– OsargumentosdeixamdeexisLrapósaexecuçãodométodo,porémasvariáveisinformadasequeforamreferenciadaspermanecem(poisnãosãodadasporesteblocodecomandos).

15

Page 16: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

Exemplo#include<stdio.h>/*Protó0pos*/voidfuncPorVarlor(inta);voidfuncPorRefer(int*b);intmain(){intx=0,y=0;funcPorValor(y);prinj("%d%d\n",x,y);funcPorRefer(&y);prinj("%d%d\n",x,y);return0;}

/*Definiçãodassubro0nas*/voidfuncPorVarlor(inta){a=1;}voidfuncPorRefer(int*b){*b=2;/*...oconteúdoapontadoporbrecebe2*/}•  Notequeasvariáveisxeysãolocais

afunçãomain,enquantoosparâmetrosaebsãolocaisafuncPorValorefuncPorRefer,respecLvamente.

Page 17: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

OperaçõesVálidasSobrePonteiros

Éválido•  somarousubtrairum

inteiroaumponteiro(pi±int)

•  incrementaroudecrementarponteiros(pi++,pi--)

•  subtrairponteiros(produzuminteiro)(pf-pi)

•  compararponteiros(>,>=,<,<=,==)

Nãoéválido•  somarponteiros

(pi+pf)

•  mulLplicaroudividirponteiros(pi*pf,pi/pf)

•  operarponteiroscomdoubleoufloat(pi±2.0)

Page 18: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

Exercícios

1)  Façaumprogramaqueleia2valoresinteirosechameumafunçãoquerecebaestas2variáveisetroqueoseuconteúdo,ouseja,estaroLnaéchamadapassandoduasvariáveisAeBporexemplo,eapósaexecuçãodaroLnaAconteráovalordeBeBteráovalordeA.

2) Escrevaumafunçãoquedadoumnúmerorealpassadocomoparâmetro,retorneaparteinteiraeapartefracionáriadestenúmero.

Page 19: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

Exercícios

3) Crieumafunçãoquerecebeoscoeficientesdeumafunçãodo2o.graueretornaasraízessemusarvetor.

4) Façaumprogramaleiaumvetorde5inteirose,depoisdeler,imprimaosvalores,semusaranotaçãodevetor[].

Page 20: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

Exercícios5)  Façaumprogramaqueachaomaioreo

menorinteirodentrodeumvetorde10inteiros.Obs:usarapenasasvariáveisaseguir: intv[10],i,*maior,*menor;

Page 21: Ponteiros - USPwiki.icmc.usp.br/images/9/9a/SSC0304-2016-01_Aula_11.pdf · ponteiros (pi*pf, pi/pf) • operar ponteiros com double ou float (pi ± 2.0) Exercícios 1) Faça um programa

PráLca6

1) Crieumafunçãoquerecebeotempototaldeumprocessoemsegundos,eretornaoequivalenteemhoras,minutosesegundos.

2) Crieumafunçãoquerecebeumamatriz4x4e

retorna(porponteiro)umvetorde4elementosquecorrespondemaomaiorvalordecadacolunadamatriz.