ponteiros - uspwiki.icmc.usp.br/images/9/9a/ssc0304-2016-01_aula_11.pdf · ponteiros (pi*pf, pi/pf)...
TRANSCRIPT
Ponteiros
IntroduçãoàCiênciadaComputaçãoI
Memória
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
EndereçodeMemória
• Ooperador“&”quandoaplicadosobreumidenLficador(nomedevariável,porexemplo)retornaoseuendereço
Memória01234567891011121314151617181920
scanf(“%d”, &x );
x
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*/
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
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
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
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; }
PONTEIROS&ARRAYS
ReferenciandoArrays
• Pode-sereferenciaroselementosdeumarrayatravésdeponteiros
• Ex:floatm[]={1.0,3.0,5.75,2.345}; float*pf; pf=&m[2]; prinj("%f",*pf);/*Escreve5.75*/
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
PONTEIROS&PARÂMETROSDEFUNÇÕES
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
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.
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)
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.
Exercícios
3) Crieumafunçãoquerecebeoscoeficientesdeumafunçãodo2o.graueretornaasraízessemusarvetor.
4) Façaumprogramaleiaumvetorde5inteirose,depoisdeler,imprimaosvalores,semusaranotaçãodevetor[].
Exercícios5) Façaumprogramaqueachaomaioreo
menorinteirodentrodeumvetorde10inteiros.Obs:usarapenasasvariáveisaseguir: intv[10],i,*maior,*menor;
PráLca6
1) Crieumafunçãoquerecebeotempototaldeumprocessoemsegundos,eretornaoequivalenteemhoras,minutosesegundos.
2) Crieumafunçãoquerecebeumamatriz4x4e
retorna(porponteiro)umvetorde4elementosquecorrespondemaomaiorvalordecadacolunadamatriz.