You are on page 1of 66

Guia Bsica del Lengua je C ANSI

<lddldFusFve>

inero PHHU

ndice

1. Antecedentes

IFIF hesrg e instlin IFIFIF indows F F F F IFIFPF vinux F F F F F IFPF iditores F F F F F F F F IFPFIF indows F F F F IFPFPF vinux F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

F F F F F F

3
S S S T T T

2. Introduccin al lenguaje C 3. Tipos, operadores y expresiones


QFIF QFPF QFQF QFRF ipos y tmos de dtos gonversin de tipos F F F F ixpresiones y operdores F gontrol de )ujo F F F F F F QFRFIF enteni if F F F F QFRFPF eteni swith F F QFRFQF eteni while F F F QFRFRF eteni for F F F F QFRFSF frek y gontinue F QFRFTF qoto y etiquets F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F

7
W IH IP IR IR IR IS IS IT IU

4. Estructuras de Datos
RFIF RFPF RFQF RFRF RFSF

ijemplo fsio F F F F F F istruturs y puniones F erreglos de istruturs F F epuntdores istruturs ypedef F F F F F F F F F F

F F F F F

F F F F F

18
IV IW PI PR PT

5. Entrada/Salida

SFIF wnejo de lid y intrd de exto E rintf y nf F F F F F PV SFPF wnejo de erhivos F F F F F F F F F F F F F F F F F F F F F F F F QH SFQF puniones wiselnes F F F F F F F F F F F F F F F F F F F F F F QR TFIF u es un puntdorc F F F F F F F TFPF epuntdores y estruturs de dtos TFPFIF erreglos F F F F F F F F F F F TFPFPF vist enlzd F F F F F F F F P F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QU RH RH RR

27

6. Apuntadores

37

TFQF epuntdores y strings F F F F F F F F F F F F F F F F F F F F F F RT

7. Funciones 8. Estructura de un programa


VFIF VFPF VFQF VFRF VFSF VFTF riles externs F F F F F F erhivos de inezdo F F istrutur de floques F F F sniilizin F F F F F F F F eursin F F F F F F F F F F il preproesdor de g F F F VFTFIF snlusin de erhivos VFTFPF ustituiones wro VFTFQF snlusin gondiionl F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F

48 53
SQ SV SW TH TH TP TP TP TQ

9. Herramientas

WFIF wke(le F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TS WFPF Debugging on gd F F F F F F F F F F F F F F F F F F F F F F F F TV WFQF gore dumps F F F F F F F F F F F F F F F F F F F F F F F F F F F F TW

65

10.Ejercicios

70

1.

Introduccin

g es un lenguje de progrmin redo en IWTW por uen hompson y hennis wF ithie en los vortorios fell omo evoluin del lenguje fD su vez sdo en fgvF el igul que fD es un lenguje orientdo l implementin de istems ypertivosD onretmente nixF g es preido por l e(ieni del digo que produe y es el lenguje de progrmin ms populr pr rer softwre de sistemsD unque tmin se utiliz pr rer pliionesF il desrrollo iniil de g se llev o en los vortorios fell de e8 entre IWTW y IWUQY segn ithieD el perodo ms retivo tuvo lugr entre IWTW y IWUQ y en IWUPF v prinipl estndrizin del lenguje g es l onoid omo exs gD on el estndr QFISWEIWVWF osteriormenteD en IWWHD ste fue rti(E do omo estndr sy @syGsig WVWWXIWWHAF v dopin de este estndr es muy mpliD por lo que los progrms que lo siguen orren sore un grn vriedd de pltformsF in l prtiD los progrmdores suelen usr elementos no portles dependientes del ompildor o del sistem opertivoF in IWUQD el lenguje g se h vuelto tn poderoso que l myor prte del nleo del sistem opertivo nixD originlmente esrito en el lenguje ensmldor hEIIGPHD fue reesrit en gF ste fue uno de los primeros nleos de sistem opertivo implementdos en un lenguje distinto l enE smldorY lgunos sos nteriores son el sistem wultisD esrito en vGsD y wster gontrol rogrm pr el fSHHH de furroughsD esrito en elgol en IWTIF in IWUVD ithie y frin uernighn puliron l primer ediin de il venguje de progrmin gF ste liro fue durnte os l espei(in informl del lengujeF il lenguje desrito en este liro reie hitulmente el nomre de el g de uernighn y ithie o simplemente u8 gF v segund ediin del liro ure el estndr exs gF il g de uernighn y ithie es el suonjunto ms sio del lenguE je que un ompildor dee de soportrF hurnte muhos osD inluso trs l introduin del exs gD fue onsiderdo el mnimo omn denominE dor en el que los progrmdores den progrmr undo desen que sus progrms fuern portlesD pues no todos los ompildores soportn ompletmente exsD y el digo rzonlemente ien esrito en u8 g es tmin digo exs g vlidoF e (nles de l dd de IWUHD g empez sustituir fesg omo el lenguje de progrmin de miroomputdores predominnteF hurnte l dd de IWVH se empezron usr los sfw gD lo que inrement su populridd signi(tivmenteF el mismo tiempoD fjrne troustrup empez trjr on lgunos omperos de fell vs pr dir funionliddes R

de progrmin orientd ojetos gF il lenguje que reronD llmdo gCCD es hoy en d el lenguje de progrmin de pliiones ms omn en el sistem opertivo wirosoft indowsY g sigue siendo ms populr en el entorno nixF in IWVQD el snstituto xionl istdounidense de istndres @exsD por sus sigls en inglsA orgniz un omitD QjIID pr estleer un espei(E in estndr de gF rs un proeso de trjo lrgo y rduoD se omplet el estndr en IWVW y se rti( omo el venguje de rogrmin g exs QF ISWEIWVWF ist versin del lenguje se onoe menudo omo exs gD o vees omo gVW @pr distinguirl de gWWAF in IWWHD el estndr exs @on lguns modi(iones menoresA fue doptdo por l yrgnizin snternionl pr l istndrizin @syA en el estndr syGsig WVWWXIWWHF ist versin se onoe vees omo gWHF xo ostnteD gVW y gWH se re(eren en eseni el mismo lengujeF no de los ojetivos del proeso de estndrizin del exs g fue proE duir un extensin l g de uernighn y ithieD inorporndo muhs funE ionliddes no o(iles y tmin nuevsF exs g est soportdo hoy en d por si l totlidd de los ompilE dores de gF v myor del digo g que se esrie tulmente est sdo en exs gF gulquier progrm esrito slo en g estndr sin digo que depend de un hrdwre determindo funion orretmente en ulquier pltform que dispong de un implementin de g omptileF in emrE goD muhos progrms hn sido esritos de form que slo pueden ompilrse en un iert pltformD o on un ompildor onretoD deido l utilizE in de lireris no estndrD omo interfes gr(s de usurioF edemsD lgunos ompildores no umplenD en el modo por defetoD ls espei(ioE nes del estndr exs g o su suesorF or ltimoD ourre freuentemente que el digo est esrito on dependeni de un tmo determindo de iertos tipos de dtosD o de un determindo orden de los its en l memori prinipl de l pltformF

2.

Tipos, operadores y expresiones

he mner resumidD podemos deir que ls vriles y ls onstntes son los ontenedores de dtos sios que se mnipuln en un progrmF v sein de delrin de un progrm de(ne ls vriles que se vn utilizrD su tipo yD opionlmenteD sus vlores iniilesF il tipo de un ojeto determin el onjunto de vlores que puede lmenr y ls operiones que se pueden relizr sore lF minD vos operdores espei(n lo que se hr on ls vriles y ls expresiones ominn vriles y onstntes pr produir nuevos vloresF

2.1. Tipos y tamaos de datos


e ontinuin tenemos un tl on los tipos sios que podemos enontrr en el lenguje gX hr short int long unsigned )ot doule grter intero orto intero intero lrgo intero sin signo xmero on om )otnte xmero on om )otnte de dole preisin

il tmo en its de d tipo depende de l rquitetur y el tipo de softwre que orre sore l mquin en que ejeutmos un progrmF n form fil de onoer el tmo de d tipo en un mquin dd es ompilr y ejeutr sore ell un progrm omo el siguienteF ste he uso del operdor sizeofD que nos d el nmero de ytes que oup un tipo ddoF

#include `s t d i o F hb int
min @ A { p r i n t f @ 4mno p r i n t f @ 4mno p r i n t f @ 4mno p r i n t f @ 4mno p r i n t f @ 4mno p r i n t f @ 4mno de de de de de de hr X 7 dn4 D sizeof @ char A A Y short X 7 dn4 D sizeof @ short A A Y int X 7 dn4 D sizeof @ int A A Y long X 7 dn4 D sizeof @ long A A Y flot X 7 dn4 D sizeof @ float A A Y doule X 7 dn4 D sizeof @ double A A Y

gdigo IX mos de tipos distintos en g

odemos espei(r modicadores pr los tipos l momento de delrr un vrileF stos pueden lterr el tmo del tipo o su omportmientoF or ejemploD l plr unsigned en relidd es un modi(dor plile ulquier tipo enteroD unque por s sol se re(ere l tipo intF u efeto es quitrle el signo l nmeroD lo que nos d un myor rngo de nmeros positivos representlesF ry ierts reliones que podemos sumir entre los tipos de gD indeE pendientemente de l pltform sore l que estmos trjndoF il tipo long tiene l menos QP its y short nun es myor que intD el ul su vez nun es myor que longF vos li(dores signed y unsigned pueden plirse un char y ulquier enteroF vos nmeros unsigned son siempre no negtivos y oedeen ls leyes de l ritmti mdulo PnD donde n es el nmero de its en el tipoF vs vriles son de(nids utilizndo un identi(dor de tipo seguido del nomre de l vrileF emos el siguiente progrmX

#include
min @ A {

`s t d i o F hb

float

els D frh Y frh a QSFHY e l s a SFH @ frh QPFH A G W F H Y p r i n t f @ 4b 7 f p son 7 f gn4 D f r h D e l s A Y

gdigo PX gonversin de tempertur de grdos phrenheit gelsius equ podemos ver que se de(nen dos vriles )otD se sign un vlor l primer y se lul l segund medinte un expresin ritmtiF in gD ls signiones tmin son expresiones y se pueden utilizr omo prte de otr expresinY sin emrgoD prtis de este tipo no son muy reomendles y que reduen l legiilidd del progrmF in l instruin printfD el especicador 7f indi que se quiere imprimir un nmero on om )otnteF edems de todo esto hy un tipo muy importnte llmdo voidD que represent lgo vo y tiene uso l esriir funiones @undo sts no devuelven un vlorA y l utilizr puntdores @undo se quiere tener un puntdor un vrile de tipo desonoidoAF emos usos sern desritos en ls seiones de funiones y puntdores respetivmenteF

2.2. Conversin de tipos


gundo esriimos un expresin ritmti en l ul hy vriles o vlores de distintos tiposD el ompildor reliz determinds onversiones ntes de evlurlF ists onversiones pueden umentr o disminuir l preiE sin del tipo l que se onvierten los elementos de l expresinF n ejemplo lro es l omprin de un vrile de tipo int on un vrile de tiE po doubleF in este soD l de tipo int es onvertid double pr poder relizr l omprinF ists onversiones son omnmente onoids on el nomre de castF egulrmenteD se pueden mezlr distintos tipos de vlores en expresioE nes ritmtisF or ejemploD el tipo hr puede ser trtdo omo enteroF in emrgoD undo se quieren relizr operiones on tipos de distintos tmosD el resultdo ser del tmo del ms grndeF vs operiones entre un nmero on punto )otnte de preisin simple y uno de preisin doleD el resultdo tiene tipo doubleF sulmenteD no hy prolems en signr vlores entre vriles de diferentes tiposD pero existen lguns exepionesX gundo l vrile es demsido peque omo pr gurdr el vlor signdoD ste se orrompeF gundo un vrile de tipo entero se le sign un vlor on deiE mlesF in este soD l mquin normlmente redonde y se pierde l preisinF min podemos relizr onversiones explits entre tiposF omemos omo ejemplo el siguiente trozo de digoX

#include #include
min @ A {

`s t d i o F hb `mth F hb

int int

i a PSTY root r o o t a s q r t @ @ double A i A Y p r i n t f @ 4 esultdo X 7 dn4 D r o o t A Y gdigo QX z udrd de un numero entero

iste progrm lul l rz udrd de un nmero enteroD previ onE versin tipo doubleF v onversion es relizd olondo entre prntesis V

el nomre del tipo requerido justo ntes del vlorF in este soD (double)D el resultdo de sqrt( (double) i); es tmin un doleD pero es onvertido utomtimente entero en l signin l vrile rootF ytro ejemplo se present ontinuinX

#include #include int

`s t d i o F hb `mth F hb

min @ A {

a IHY a HFSY i f @ `a@ float A A { a @ float A Y } gdigo RX ijemplo de onversin

float Y int Y

2.3. Expresiones y operadores


vos distintos operdores del lenguje permiten formr expresiones tnto ritmtis omo lgisX CD E sumD rest CCD ! inrementoD deremento D GD 7 multipliinD divisinD mdulo D rotin de its l derehD izquierd 8 exh ooleno | y ooleno omplemento I 3 omplemento PD xy lgio aaD 3a igulddD desiguldd 88D || exhD y lgio `D `a menorD menor o igul bD ba myorD myor o igul el usrlos dee tenerse en uent su preendeni y ls regls de soiE tividdD que son ls normles en l myor de lengujes y en mtemtisF e dee onsultr el mnul de refereni pr otener un expliin detE lldF edems hy tod un serie de operdores que relizn un operin W

y un signin l vezD omo Ca y 8aF in l evluin de expresiones lgisD los ompildores normlmente utilizn tnis de evluin rpidF r deidir si un expresin lgi es iert o fls muhs vees no es neesrio evlurl ompletmenteF or ejemploD dd un expresin omo <exp1> || <exp2>D el ompildor evl primero <exp1> yD si es iertD no evl <exp2>F or ello se deen evitr onsE truiones en ls que se modi(quen vlores de dtos en l propi expresinX su omportmiento puede depender de l implementin del ompildor o de l optimizin utilizd en un ompilin o en otrF istos son errores que se pueden ometer filmente en g y que un signin es tmin un expresinF heemos evitr instruiones omo

if (( x++ > 3 ) || ( x < y ))


y esriir en su lugr

x++; if (( x > 3 ) || ( x < y ))


ry un tipo espeil de expresin en g que se denomin expresin onE diionl y est representd por los operdores c XF e utiliz sX

<e> ?

<x> : <y>

ist operin d omo resultdo <x> si <e> es ierto e <y> si noF e ontinuinD un ejemplo de su usoX

#include
{

`mth F hb

int

min @ A

int a I D a Q Y float x D y a H F H Y int s a Q F I R I S W Y


x a @ b A c X Y @ b H F H A c @ yas i n @ s G V A A X @ ya o s @ s G R A A Y gdigo SX ixpresiones ondiionles

IH

2.4. Control de ujo


r lterr el )ujo de ejuin del progrmD que por s slo onsiste en l ejeuin de tods ls instruiones pso pso en el orden en que fueron ddsD usmos ls llmds sentenis de ontrol de )ujoF ills nos permiten tomr deisiones y relizr lulos muho ms omplejosF

2.4.1. Sentencia if
v senteni de ontrol de deisin si es if (<e>) then <s> else <t>F ivl un expresin oolen yD si se umpleD ejeut l senteni sF in so ontrrioD ejeut l senteni tF v segund prte de senteni !else <t>!D es opionlF

void

e r o @ double A { i f @ aa H F H A p r i n t f @ 4 e s e r o n4 A Y else p r i n t f @ 4 e s d i f e r e n t e de e r o n4 A Y gdigo TX gontrol de )ujo on

if

eordemos que g onsider vlores diferentes de ero omo verdderos y el ero omo flsoF

2.4.2. Sentencia switch


v senteni swith es til undo se quiere omprr un vlor ddo onE tr un rngo grnde de vloresF e us de l siguiente mnerX swith @ vlor A { s e v l o r I X `s e n t e n i s b s e v l o r P X `s e n t e n i s b FFF d e f u l t X `s e n t e n i s b } gdigo UX gontrol de )ujo on

switch

gundo se enuentr un senteni se que onuerd on el vlor del swith se ejeutn ls sentenis que le siguen y tods ls dems prtir II

de hD hst onseguir l primer instruin breakF v entrd default es opionlY se tiv undo ningn otro so de omprin result iertoF veropion @

char

A {

swith @ A { se 9 9 X p r i n t f @ 4yp rek Y se 9 9 X p r i n t f @ 4yp rek Y se 9 9 X se 9d 9 X p r i n t f @ 4yp rek Y defult X p r i n t f @ 4yp }

en4 A Y fn4 A Y

g o hn4 A Y cn4 A Y

gdigo VX ijemplo de

switch

2.4.3. Sentencia while


ytr lse de sentenis de ontrol de )ujo nos permite relizr repetiioE nes de un serie de instruionesF in g tenemos tres sentenis de repetiinF r empezr tenemos l senteni while (<e>) <s> vs instruiones <s> se ejeutn repetidmente mientrs l evluin de l expresin <e> se verdderF

long r i z @ long long r a I Y

vlor A {

w h i l e @ r r `a v l o r A rCCY return r Y

sX do <s> while { <e> }F st ejeut el onjunto de instruiones ddo l menos un vezF is deirD slo evl l expresin ondiionl en l segund repetiinF IP

while n vriin liger de l senteni while es do ... whileD que se esrie


gdigo WX gontrol de )ujo on

2.4.4. Sentencia for


ytr senteni itertivD que permite iniilizr los ontroles del ilo es l senteni forX

for (<i>; <e>; <p>) { <s> }


el esriir estoX IF e ejeut i PF wientrs <e> es iertoD se ejeut <s> y luego <p>F xotemos que esto es equivlente

<i>; while ( <e> ) { <s>; <p>; }


il ejemplo nterior se podr esriir omoX

long r i z @ long long r Y


}

vlor A {

return

f o r @ r a I Y r r `a v l o r Y rCCA Y rY gdigo IHX gontrol de )ujo on

for

se omiene un nuev iterinD sltndose ls instruiones restntes de l repetiin y evlundo l expresin de ontrolF emos el siguiente ejemploX

2.4.5. Break y Continue vs instruiones break y continue son utilizds dentro de sentenis de repetiin pr lterr el )ujo de ontrol dentro de ls mismsF break provo que se termine l ejeuin de un iterinF continue provo que

IQ

void finlountdown @ void A int ount a I H Y while @ ount b I A { i f @ ount aa R A


strtengines @A Y

if @

s t t u s @ A aa exsxq A rek Y

printf @4 7 d 4 D ount A Y ount aa H A { lunh @ A Y p r i n t f @ 4 h u t t l e l u n h e d n4 A Y

if @
} { }

else
p r i n t f @ 4exsxq o n d i t i o n r e e i v e d F n4 A Y p r i n t f @ 4gount h e l d t 7 dn4 D ount A Y

gdigo IIX gontrol de )ujo on

break

IR

3.

Estructuras de Datos

n estrutur es un olein de un o ms vrilesD posilemente de diferentes tiposD grupds jo un nomre que permite her refereni stsF vs estruturs yudn orgnizr dtos omplidosD prtiulrmente en progrms lrgosD y que permite reunir un grupo de vriles relionds pr que sen trtds omo un unidd en lugr de distnts entiddesF n ejemplo trdiionl es l nmin de un empledoD un empledo se puede desriir on un nomreD direinD nmero de seguro soilD dul de identiddD slrioD etF snluso lguno de stos podrn ser entruturs su vezF sgulmenteD se puede onsiderr un punto en el eje de oordends omo un estruturD l igul que un retngulo es un onjunto de puntosD y s suesivmenteF

3.1. Ejemplo Bsico


gontinundo el ejemplo de los puntos en un retD se puede de(nir un punto medinte l siguiente estruturX

struct point { int x; int y; }


v plr lve struct introdue l delrin de un estruturD que es un list de delriones entre llvesF iste tipo de delrin de(ne un tipoF v llve que ierr l estrutur puede estr seguid de un list de vrilesD omo ulquier otro tipoF

struct{...} x, y, x; isto es sinttimente nlogo X int x, y, z; in el sentido que d delrin estlee ests vriles omo del tipo espei(doD struct e int y el espio orrespondiente es sgindo pr ellsF n delrin que no es seguid de un list de vriles no reserv esE pio en memoriD y solo desrie un plntill de un estuturX struct x;F in emrgoD en el so struct point pt; se de(ne un vrile pt que es un estrutur de tipo struct pointF n estrutur puede ser iniilizd espei(ndo un list de expreE siones onstntes pr d miemroD struct maxpt = {320,200};F sgulE menteD un estrutur puede iniilizrse por signin o por l llmd de un funin que devuelve el tipo orretoF
IS

vos miemros de un estrutur se eden por un onstruin de l form nombre-estructura.nombre-miembroF il punto F onet el nomre de l estrutur on el nomre del miemroF or ejemplo pr imprimir ls oordends se utiliz l instruin printf(''%d,%d'', pt.x, pt.y);F vs estruturs pueden ser niddsD por ejemploX

struct rect { struct point pt1; struct point pt2; };


i se delr screen omo un tipo rectD pr referirse l oordend x del primer punto es screen.pt1.xF

3.2. Estructuras y Funciones


e utiliz un ejemplo pr ilustrr mejor l letorX

/* makepoint: construye un punto de las componente x e y */ struct point makepoint(int x, int y) { struct point temp; temp.x = x; temp.y = y; return temp; };
ist funin puede ser usd pr iniilizr ulquier estrutur dinE mimenteD o pr proveer rgumentos pr un funinX

struct rect screen; struct point middle; struct point makepoint(int, int); screen.pt1 = makepoint(0,0); screen.pt2 = makepoint(XMAX, YMAX); middle = makepoint((screen.pt1.x + screen.pt2.x)/2, (screen.pt1.y + screen.pt2.y)/2);
il prximo pso es her un funin que plique ritmti entre dos puntosX

IT

/* addpoints: add two points */ struct addpoint(struct point p1, struct point p2) { p1.x += p2.x; p1.y += p2.y; return p1; }
equ tnto los rgumentos omo el vlor de retorno son estrutursF e inrementn los omponentes en p1 en lugr de usr un vrile temporl on el (n de enftizr que ls estruturs son psds omo prmetros omo ulquier otro vlorF i un estrutur grnde se quiere psr un funinD generlmente es ms e(iente psr un puntdor que opir tod l estruturF epuntdoE res estruturs son omo un puntdor ulquier tipo de vrilesF v delrin se d ontinuinX

struct point *pp; sndi que pp es un puntdor un estrutur de tipo struct pointF i pp punt un estrutur pointD Bpp es l estruturD y (*pp).x y (*pp).y son los miemrosF r usr ppD se puede esriirX

struct point origin, *pp; pp = &origin; printf(''origen es (%d,%d)\n'', (*pp).x, (*pp).y);


vos prntesis son neesrios en el eso los miemros y que el opeE rdor F tiene myor preedeni que BF min es importnte onoer que si p es un puntdor un estruturD entones p->miembro-estructuraD se re(ere un miemro en prtiulrD s que es equivlente esriirX

printf(''origen es (%d, %d)\n'', pp->x, pp->y); intonesD ls siguientes expresiones son equivlentesX

struct rect r, *rp = &r; r.pt1.x rp->pt1.x (r.pt1).x (rp->pt1).x

IU

3.3. Arreglos de Estructuras


e ontinuin se present un progrm que uent ls ourrenis de plrs lve del lenguje g leds desde l entrd estndrF e requiere un rreglo de strings pr gurdr los nomres y un rreglo de enteros que llevn ontdores de d plr lve onseguidF n posiilidd es usr dos rreglos prlelosD keyboard y keycount X

char *keyword[NKEYS]; int keycount[NKEYS];


in emrgoD existe un mejor form de orgnizrX

char *word; int cout; struct key { char *word; int count; } keytab[NKEYS];
y tminX

struct key { char *word; int count; }; struct key keytab[NKEYS];


isto delr un estrutur tipo keyD de(ne un rreglo keytab de estruE turs de este tipoD y estlee el espio en memori neesrioF hdo que keytab ontiene un onjunto de nomresD l iniilizin es trivilX

struct key { char *word; int count; } keytab[] = { "auto", 0, "break", 0, "case", 0, "char", 0, "const", 0, "continue", 0,
IV

};

"default", 0, /* ... */ "unsigned", 0, "void", 0, "volatile", 0, "while", 0

is equivlente enerrr entre llves d elemento del rreglo undo son tipos siosX

{ "auto", 0 }, { "break", 0 }, { "case", 0 }, ...


il progrm omienz on l de(niin de keytabF v rutin main lee de l entrd repetidmente d plr trvs de l funin getwordF gd plr es hequed en el rreglo on un funin que reliz un squed inriD por esto ls lves deen estr ordends de form reienteF

#include `s t d i o F hb #include ` t y p e F hb #include `s t r i n g F hb #define weyh IHH int int


/

getword @ char D int A Y i n s e r h @ char D struct key D


count C keywords

int A Y

min @ A {

int n Y char word weyh Y while @ getword @ word D weyhA 3a i f @ i s l p h @ word H A A i f @ @ n a i n s e r h @ word D keyt D for @ n a H Y n ` xuiY nCCA i f @ keyt n F ount b H A
p r i n t f @ 4 7Rd 7 s n4 D keyt n F ount D keyt n F ountCCY

iypA xuiA A ba H A

IW

}
/

return

HY

keyt n F word A Y

int

b i n s e a r c h :

i n s e r h @ char word D

f i n d

word

in

struct

tab [ 0 ] . . . tab [ n

1]

key t D

int

nA

ond Y low D high D mid Y low a H Y high a n I Y while @ low `a h i g h A { mid a @ lowCh i g h A G P Y i f @ @ ond a strmp @ word D t mid F word A A ` H A h i g h a mid I Y else i f @ ond b H A low a mid C I Y }

int int

else return

mid Y

}
/

return IY
getword : get next word or c h a r a c t e r from input

int

getword @ char word D

int

lim A

int D g e t h @ void A Y void ungeth @ int A Y char w a word Y while @ i s s p e @ a g e t h @ A A A


@ 3a iypA wCC a Y if @3 islph @A A { w a 9 H 9 Y return Y } for @ Y l i m b H Y wCCA i f @ 3 i s l n u m @ w a g e t h @ A A A PH

if

} w a 9 H 9 Y return word H Y

ungeth @ wA Y break Y

gdigo IPX ueyword gount il tmo de este rreglo se puede otener trvs de l multipliin de l ntidd de entrds por el tmo de d unF v ntidd de elementos es onoid por el progrmdor en este soD y el tmo de d elemento puede ser ddo por l funin sizeof (type name)F ist funin retorn el tmo de un tipo en ytesF v mro #define NKEYS (sizeof keytab / sizeof(keytab[0])) pueE de ser usd pr drle un vlor NKEYSF sulmenteD l funin sizeof no puede ser usd en un mro #if lineD y que el preproesdor no prE se tiposF in emrgoD ls expresiones en #define no son evluds por el preproesdorD s que el digo es legl en este puntoF

3.4. Apuntadores a Estructuras


r ilustrr este puntoD se present un versin del progrm ontdor de plrs lves usndo puntdores en lugr de rreglosF v delrin extern de keytab no requiere ser midD pero main y binsearch neesitn modi(inF

#include `s t d i o F hb #include ` t y p e F hb #include `s t r i n g F hb #define weyh IHH int getword @ char D int A Y struct key i n s e r h @ char D struct
/ count C keywords ; p o i n t e r v e r s i o n

key D
/

int A Y

min @ A {

char word weyh Y struct key p Y while @ getword @ word D

weyhA 3a iypA PI

}
/

@ i s l p h @ word H A A @ @ pa i n s e r h @ word D keyt D xuiA A 3a xvvA pbountCCY for @ p a keyt Y p ` keyt C xuiY pCCA i f @ pbount b H A p r i n t f @ 4 7Rd 7 s n4 D pbount D pbword A Y return H Y

if

if

struct
{ nA

b i n s e a r c h :

key i n s e r h @ char word D s t r u k key t D

f i n d

word

in

tab [ 0 ] . . . tab [ n

1]

int

int ond Y struct key low a 8t H Y struct key h i g h a 8t n Y struct key mid Y while @ low ` h i g h A
mid a low C @ high low A G P Y i f @ @ ond a strmp @ word D midbword A A ` H A h i g h a mid Y else i f @ ond b H A low a mid C I Y

} }

else return

mid Y

return

xvvY gdigo IQX ueyword gount P

ixisten vrios spetos que vle l pen resltrF rimeroD l delrion de l funin binsearch dee indir que retorn un puntdor un estruE tur en lugr de un enteroY i est funin enuentr l plrD retorn el puntdor stY si no l enuentrD retorn NULLF in segundo lugrD los elementos de keytab deen ser edidos por punE tdoresF v iniilizin pr low y high son hor puntdores l omienzo y ltim posiin de l tlF il mio ms importnte es justr el lgoE ritmo pr segurrse que no genere un puntdor ilegl o intente eder un elemento fuer del rregloF pinlmenteD en el main se enuentr l instruinX PP

for (p = keytab; p < keytab + NKEYS; p++)D i p es un puntdor un estruturD l ritmti sore p tom en uent el tmo de l estruturD s que pCC inrement p l ntidd orret pr moverse l prximo elemento trvs del espio de direiones de memoriF in emrgoD no se dee sumir que el tmo de l estrutur es l sum de sus miemros y que en osiones se requiere un linemiento de los ojetosF

3.5. Typedef
g provee un filidd llmd typedef pr rer nuevos nomres pr tipos de dtosF or ejemploD l delrinX

typedef int length; re que el nomre length se un sinnimo pr intF osteriormenteD este puede ser usdo pr otrs delrionesF ytros ejemplos sonX

Length len, maxlen; Length *lengths[];


he mner similrD l delrin typedef char *String;D he que tring se un sinnimo pr hr B o puntdor rterD el ul puede ser usdo enX

declarations and casts: String p, lineptr[MAXLINES], alloc(int); int strcmp(String, String); p = (String) malloc(100);
e dee notr que el tipo delrdo en typedef pree en l posiin del nomre de l vrileD no despus de l plr typedefF

PQ

4.

Entrada/Salida

v entrd y slid de un sistem opertivo se re(ere l interin de ste on un tereroF st es posile medinte l entrd y slid de den de rteres hi y desde el sistemF vos perferios de l omputdor omo el teldo y l pntll son los dispositivos por defeto pr est treF il tem trtdo en este ptulo no es relmente prte del lenguje gD sin emrgo existe l neesidd de her enfsisF il estndr de g ensi de(ne este onjunto de lireris preismente pr que en ulquier sistem donde exist g pued her interinF e hr hinpi en ls lireris <stdio.h>D <string.h> y <ctype.h>F ists lireris implementn un modelo simple pr her entrd y slid de textoF n )ujo de texto onsiste de un seueni de lnesY d lne termin on el rter de nuev lne  nF il menismo ms simple de letur de un rter por vez de l entrd estndrD normlmente desde el teldoD es on l funin int getchar(void)F st retorn el prximo rter leido d vez que es llmdoD o EOF si enuentr el (nl del rhivoF il smolo onstnte iyp @ind of pileA est de(nido en <stdio.h>F gontrrimenteD l funin int putchar(int) es usd pr olor el entero indido omo prmetro en l slid estndrD que por defeto en l pntllF st funin retorn el rter esritoD o iyp si un error ourreF gomo se mostr en otros ejemplos l funin printf reliz el mismo trjo pero on un string omo prmetroF r usr ests funiones se dee mostrr en el enezdo l instruinX #include <stdio.h>F or ejemploD onsidere el progrm siguiente que onE vierte l entrd en letrs minsulsX

#include #include
min @ A {
/

`s t d i o F hb ` t y p e F hb
lower : c o n v e r t input to lower case

@ @ a g e t h r @ A A 3a iypA puthr @ tolower @ A A Y return H Y gdigo IRX vower v funin tolower est de(nid en <ctype.h>Y onvierte un string de PR

int while

mysul minsulF

4.1. Manejo de Salida y Entrada de Texto - Printf y Scanf


int printf()char *format, arg1, arg2, ...; ist funin onvierteD formte e imprime sus rgumentos l slid estndrF etorn el nmero de rteres impresosF il string ddo en el prmetro formt ontiene dos tipos de ojetosX E rteres ordinriosD que son opidos l slidD y rteres que espei(n un onversinD esto us onversin e impresin del rgumento siguienteF gd onversin omienz on el signo 7 y termin on l vrile que se dese trnsformrF vos rteres de onversin se espei(n en l siguiente tl expresndo tmin su tipo y l mner en que ser impresoX
dDiY enteroY nmero deiml oY enteroY nmero otl sin signo xDY enteroY nmero hexdeiml sin signo uY enteroY nmero deiml sin signo Y enteroY rter sY string @hr BAY imprime l den de rteres fY doleY EmFdddddd D donde el nmero de d9s son dds por l preisin @T por defetoA eDiY doleY EmFdddddd eCGExx o EmFddddddiCGExxD donde el nmero de d9s umplen lo nterior gDqY doleY us 7e o 7i si el exponente es menor que ER o myor o igul que l preisinD sino usr 7fF pY void BY puntdor 7Y no onvierte ningn rgumentoD imprime 7 edemsD se puede espei(r l preisin on BD en uyo so el vlor es luldo por l onversin del prximo rgumento @dee ser un enteroAF or ejemploD pr imprimir lo sumo mx rteres de un string s se us printf("%.*s", max, s); elguns vriiones pr l impresin de strings se d ontinuinX PS v funin printf est de(nid porX

:%s: :hello, world: :%10s: :hello, world: :%.10s: :hello, wor: :%-10s: :hello, world: :%.15s: :hello, world: :%-15s: :hello, world : :%15.10s: : hello, wor: :%-15.10s: :hello, wor :
v funin sprintf reliz l mism onversin de printfD pero gurd l slid en un stringX

int sprintf(char *string, char *format, arg1, arg2, ...); ist funin revis los rgumentos en rgI D rgPD etFD de uerdo l formto explido previmenteD pero olo el resultdo en string en lugr de l slid estndrF n uen ejemplo es mostrdo ontinuinD que muestr un versin mnim de printfD que proes un list de longitud vrile de rgumentosX

#include
/ l i s t

`s t d r g F hb
minimal p r i n t f with v a r i a b l e argument

m i n p r i n t f :

void

m i n p r i n t f @ char fmt D F F F A
to each unnamed arg in turn

v l i s t p Y / p o i n t s char p D s v l Y int i v l Y double d v l Y v s t r t @ p D fmt A Y / {

make

ap

p oi n t

to

1 st

unnamed

for
{ } {

arg

@ p a fmt Y p Y pCCA @ p 3a 9 79 A puthr @pA Y continue Y

if

switch @CCp A case


9d 9 X i v l a vrg @ p D

int A Y
PT

break Y case 9 f 9 X

printf @4 7 d4 D i v l A Y

} } vend @ p A Y

d v l a vrg @ p D double A Y printf @4 7 f 4 D dvl A Y break Y case 9 s 9 X for @ s v l a vrg @ p D char A Y s v l Y s v l CCA puthr @ s v l A Y break Y default X puthr @pA Y break Y

c l e a n

up

when

done

gdigo ISX ersin wnim de printf gontrrimenteD l funin scanf que es nlog printfD int scanf(char *format, ...)D lee rteres de l entrd estndrD los interpret de uerdo l formto espei(do en formatD y gurd el resultdo en los suesivos

rgumentosY el resto de los rgumentosD dee ser un puntdor que indi donde el orrespondiente string dee ser lmendoF ixiste un funin similrD sscanf que lee de un string en lugr de l entrE d estndrD int sscanf(char *string, char *format, arg1, arg2, ...)F evis el string de uerdo l formto en formt y gurd el resultdo en los suesivos rgumentosD stos deen ser puntdoresF v espei(in de los formtos viene dd por l tl mostrd preE vimenteF

4.2. Manejo de Archivos


vos ejemplos vistos previmente solo tomn en uent letur y esriE tur de texto por l slid y entrd estndrF il prximo pso es esriir un progrm que ed rhivos externosF n progrm que ilustr l neesidd pr tl operin es el omndo de xs catD que onten un onjunto de rhivos en l slid estndrF ste es usdo tmin pr imprimir rhivos en l pntllF or ejemploD el omndoX

cat x.c y.c

PU

smprime el ontenido de los rhivos xF y yF en l slid estndrF il sunto es mo implementr stoD es deirD mo rreglr los rhivos de mner que d nomre de rhivo se psdo omo rgumento y se ledoF equ se mostrr mo leer los dtos de rhivos externosF v regls son senillsD ntes de que un rhivo se ledo o esritoD dee ser ser ierto por l funin fopen de l lireri <stdio.h>F st funin tom un nomre omo xF o yFD reliz un trnsin on el sistem opertivo y retorn un puntdor que ser usdo pr ls posteriores leturs y esritursF iste puntdor llmdo apuntador a un archivoD punt un estrutur de(nid omo FILE que ontiene informin sore el rhivo omo l uiE in de un u'erD l posiin l rter tul en el u'erD si el rhivo est siendo ledo o esritoD y si h ourrido un error o iypF in emrgoD los usurios no neesitn ser estos detllesF r delrr un puntdor de este tipo se utiliz por ejemploX FILE *fp;D esto die que fp es un puntdor un rhivoF v llmd pr rir un rhivo en un progrm esX

fp = fopen(name, mode); il primer rgumento de fopen es un string que ontiene el nomre del rhivD el segundo es el modo de pertur del rhivoX letur @rAD esritur @wA y gregr @AF i un rhivo que no existe es ierto pr esritur o pr dirD es redo si es posileF erir rhivos existente pr esritur us que el viejo ontenido se desehdoD mientrs que se indi el modo ppend preserv el ontenidoF il rir un rhivo que no existe pr letur indir un errorF ytrs uss de error son trtr de leer un rhivo undo no tiene los permisos propidosF i existe lgn errorD fopen retornr xvvF ixisten un pr de funiones tiles que permitirn l esritur y letur de un rhivoD un vez iertoF getc retorn el prximo rter de un rhivo ser ledoD iyp si enuentr (nl de rhivo o errorX int getc(FILE *fp) or otro ldoD putc es un funin pr esriir en un rhivoX int putc(int c, FILE *fp) putc esrie el rter c l rhivi fp y retorn el rter esritoD o iyp si un error ourriF gundo un progrm en g se ejeutD el sistem opertivo es responsle de rir tres rhivos y provee puntdores pr stosF istos rhivos son l entrd estndrD l slid estndr y el error estndrY los puntdores orrespondientes son denomindos stdinD stdoutD y stderrD y son delrdos en <stdio.h>F xormlmenteD stdin est soido l teldoD y stdout y stE derr estn soidos l pntllF in emrgoD stdin y stdout pueden ser redirigidos otros rhivosF edemsD est lireri ofree ls funiones fscanf y fprintf pr esritur
PV

y letur de un rhivoF sts son idntis scanf y printfD exepto que el primer rgumento es un puntdor rhivo que espei( el rhivo ser ledo y esritoF

int fscanf(FILE *fp, char *format, ...) int fprintf(FILE *fp, char *format, ...)
gon este onoimentoD estmos en l pidd de interpretr un progrE m similr l cat de xs que us ls funiones explids previmente

#include
/ cat :

`s t d i o F hb
c o n c a t e n a a r c h i v o s

min @ int rg D char rgv A { psvi f p Y void f i l e o p y @ psvi D psvi A i f @ r g aa I A / n o a r g s ; p i d e f i l e o p y @ stdin D stdout A Y

de

s t d i n

else while@ r g b H A i f @ @ f p a f o p e n@CCrgv D


{

4 r 4 A A aa xvvA

} else { f i l e o p y @ fp D s t d o u t A Y f l o s e @ fp A Y } return HY

p r i n t f @ 4 t X n 9 t open 7 s n D rgv A Y return IY

G f i l e o p y X o p i r h i v o i f p o f p G v o i d f i l e o p y @ psvi i f p D psvi o f p A { int Y w h i l e @ @ a g e t @ i f p A A 3a iypA put @ D o f p A Y } gdigo ITX ersin propi de cat PW

vos puntdores stdin y stdout son ojetos de tipo FILE *F stos son onstntesD por esto no es posile signrles lgoF pinlmenteD l funin fclose reliz lo inverso de fopenD ierr l onexin entre el puntdor l rhivo y el propio rhivoF or lgunos prmetros que se estleen en el sistem opertivoD es uen ide ejeutr est operin siempre que se re un rhivoF

int fclose(FILE *fp) e ontinuin se present un implementin de cat ms segurX


`s t d i o F hb
c o n c a t e n a archivos , v e r s i o n 2

#include
/ cat :

min @ int rg D char rgv A { psvi f p Y void f i l e o p y @ psvi D psvi A Y char prog a rgv H Y / n o m b r e

del

programa

para

if

e r r o r e s

/
; c o p i a de s t d i n

else while @ r g b H A i f @ @ f p a f o p e n@CCrgv D


{

@ r g aa I A / n o a r g s f i l e o p y @ stdin D stdout A Y

4 r 4 A A aa xvvA

} { } {

f p r i n t f @ stderr D 4 7 s X n 9 t open 7 s n4 D prog D rgv A Y exit @IA Y

else
f i l e o p y @ fp D s t d o u t A Y f l o s e @ fp A Y @ f e r r o r @ stdout A A f p r i n t f @ stderr D 4 7 s X e r r o r w r i t i n g s t d o u t n4 D prog A Y exit @PA Y

if

} exit @HA Y

QH

gdigo IUX ersin ms segur de cat in este ejemplo se puede ilustrr el uso del puntdor stderr iste progrm heque errores de dos mnersF rimeroD l slid de dignstio produid por fprintf se redirige stderrF egundoD el progrm us l funin exitD que termin l ejeuin del progrm undo es llmdoF il rgumento de est funin es el que se retorn ulquier que llme l funinD puede indir esttus de xito o errorF he form onvenionlD un vlor de retorno ero indi que no ourri lgn errorD y distinto de ero indi un situin de fll del progrmF ist es similir utilizr return exprF v funin ferror retorn distinto ero si un error ourri en el rhivo puntdo por fpF

int ferror(FILE *fp)

4.3. Funciones Miscelneas


char *fgets(char *line, int maxline, FILE *fp)Y est funin lee l prxim lne ser led de un rhivo y l retornF etorn xvv si llego iyp u ourri un errorF int fputs(char *line, FILE *fp)Y retorn iyp si ourri un errorD y un vlor no negtivo en so ontrrioF v lireri de funiones gets y puts son similres fgets y fputsD pero opern sore stdin y stdoutF
e ontinuin se listn ls funiones ms usds de l lireri <string.h>X strt@sDtAD onten t l (nl de sF strnt@sDtDnAD onten n rteres de t l (nl de sF strmp@sDtA retorn negtivoD eroD o positivo pr los sos s `t D s aa tD s bt respetivmenteF strnmp@sDtDnA igul que strmp pero solo en los primero n rteresF strpy@sDtA opi t en sF strnpy@sDtDnA opi lo sumo n rteres de t en s strlen@sA retorn l longitud de s strhr@sDA retorn el puntdor l primer rter en sD o xvv si no est presenteF QI

strrhr@sDA retorn un puntdor l ltimo rter en sD o xvv si no est presenteF elguns funiones omunes de l lireri <ctype.h> que relizn onverE siones y veri(in de rteresF islph@A distinto de ero si es un rter del lfetoD H si noF isupper@A distinto de ero si est en mysulD H si noF islower@A distinto de ero si est en minsulD H si noF isdigit@A distinto de ero si es un dgitoD H si noF islnum@A distinto de ero si islph@A o isdigit@AD H si no isspe@A distinto de ero si es un espio en lnoD tuldorD nuev lneD entre otrosF toupper@A retorn onvertid mysulF tolower@A retorn onvertido minsulF is importnte onoer lguns funiones de uso vnzdo omoX r ejeuin de omndos l funin system(char *s) ejeut el omndo ontenido en el string sF or ejemploD system@dteAF r reserv de espio de memori pr estrutursD ls funiones mllo y llo otienen los loques de memori dinmimenteD los prototipos sonX void *malloc(size_t n)D que retorn un puntdos n ytes de lmenmientoD o xvv si l petiin no se puede umE plirY void *calloc(size_t n, size_t size)D retorn un puntdor su(iente espio de memori pr un rreglo de n ojetos del tipo espei(doD o xvv si no se puede umplir l petiinF or ejemploX

ip = (int *) calloc(n, sizeof(int));

free@pAD lier el espio seldo por el puntdor en pF v mner ms segur de lierr espio esX

for (p = head; p != NULL; p = p->next) /* INCORRECTO */ free(p); for (p = head; p != NULL; p = q) {


QP

/* CORRECTO */

q = p->next; free(p);
elguns funiones mtemtis se enuentrn disponiles en <math.h> sin@xA sine of xD x in rdins os@xA osine of xD x in rdins tnP@yDxA rtngent of yGxD in rdins exp@xA exponentil funtion ex log@xA nturl @se eA logrithm of x @xbHA logIH@xA ommon @se IHA logrithm of x @xbHA pow@xDyA xy sqrt@xA squre root of x @xbHA fs@xA solute vlue of x

QQ

5.

Funciones

vs funiones dividen grndes tres de mputo en vris ms pequesD y permiten l posiilidd de onstruir sore lo que otros y hn hehoD es deirD permite l reutilizin de digoF vs funiones propids oultn los detlles de operin de ls prtes de un progrmD s dn lridd l totlidd y filitn l penos tre de her el mismo mio numeross veesF iste lenguje se dise pr her que ls funiones fuern e(ientes y files de usrY los progrms esritos en g se omponen de muhs funiones peques en lugr de slo lguns grndesF n progrm puede estr omE puesto de uno o ms rhivos de digoF sto es posile y que ls fuentes o rhivos de digo pueden ser ompildos seprdmente pr ser posteriorE mente enlzdos entre ellos e inluso on lireris ompilds previmente del sistemF n funin en g dee ser delrd y de(nidD en el primer soD se le onoe omo prototipo de l funin donde se indi el tipo de retornoD el nomre y los rgumentos de l funinF osteriormenteD un funin es de(nid indindo l informin del prototipo nuevmente y el uerpo de l funinD es deirD ls lnes de digo que ejeutF n ejemplo lsioD es un funin que le d lne de l entrd estnE dr o un rhivo y verique que onteng un ptrn prtiulrF uede oservr en su terminl de omndos de nixD que umple l mism funionlidd del omndo grepF v form ptim de desrollr este progrm es esriir tres funiones que distriuyn l treD sin emrgoD siempre se pueden esriir tods ls instruiones en l funin prinipl sin el uso de surutins uxiliresF ist funin posee el nomre predetermindo de main y es l que represent el onjunto de instruiones priniples que se ejeutn por defetoF il digo se present ontinuinX

#include `s t d i o F hb #define wevsxi IHHH int int


/ D e c l a r a c i o n de

l o n g i t u d

maxima

de

la

l i n e s

g e t l i n e @ char l i n e D int mxA s t r i n d e x @ char s o u r e D char s e r h f o r A Y pttern a 4 ould 4 Y


p r i n c i p a l / patron a buscar

f u n c i o n e s

char
/

Funcin

QR

min @ A { char l i n e wevsxi Y int found a H Y while @ g e t l i n e @ l i n e D wevsxiA b H A i f @ s t r i n d e x @ l i n e D p t t e r n A ba H A { printf @4 7 s4 D line A Y foundCCY } return found Y }
/ y g e t l i n e : r e t o r n a la guarda la l i n e a en la v a r i a b l e s

int g e t l i n e @ char int D i Y while @ l i m


i a HY

l o n g i t u d

s D

int

lim A {

}
/

b H 88 @ ag e t h r @ A A 3a iyp 88 3a 9 n 9 A s i CC a Y i f @ aa 9 n 9 A s i CC a Y s i a 9 H 9 Y return i Y

s t r i n d e x : no

r e t o r n a

e l

i n d i c e

de

en

s ,

int s t r i n d e x @ char s D char t A int i D j D k Y for @ i a H Y s i 3a 9 H 9 Y i CCA for @ jai D kaHY t k 3 a 9 H 9 88 if


} } Y

s i

{ { s j aat k Y j CCD kCCA

return

@ k b H 88 t k aa 9 H 9 A iY

return IY
gdigo IVX qrep propio il pseudodigo muy lto nivel pr myor lridd esX QS

while (no existen mas lineas) if (la linea contiene el patron) imprimir la linea
v funin que otiene ls lnes y su vezD veri( que existn ms lnesD es getlineF v funin pr imprimir l lineD es l onoid printf ontenid en l lireri stdio.h inluid en el enezdo del rhivoF v que revis si el ptron se enuentr en l den de rteres es strindex(s,t)D st retorn l posiin o ndie del primer rter t que onsigue de izquierd dereh en el string sF il vlor negtivo de retorno indi que no se enuentr el rter en l lne espei(dF he mner generlD l de(niin de un funin posee l siguiente estruE turX

tipo-retorno nombre-funcion(declaracion argumentos) { declaraciones y sentencias }


hdo el so en que no se interese retornr lgn vlorD el tipo de retorno puede ser espei(do omo voidF in so ontrrioD se dee espei(r l (nl de l funin un ltim instruin return expresinF ist expresin ser onvertid en el tipo delrdo en el prototipo de l funin de ser neesrioF edemsD es opionl que l funin que relie l llmd pture en un vrile el vlor de retornoF v meni de l rg y ompilin de un progrm en g vri deE pendiendo del sistemF in el so de los sistems nixD utilizdos pr este ursoD se utiliz el omndo gccF or ejemploD suponiendo que ls tres funioE nes estn gurdds en tres rhivos seprdos main.cD getline.c y strindex.c Y pr ompilrlos se ejeut en un shell de omndosX

gcc main.c getline.c strindex.c isto ompilr los tres rhivosD generndo un rhivo on el digo oE jeto o mquin on extensin Fo soido d unoX main.oD getline.o y strindex.oF vuegoD sern rgdos en un rhivo ejeutle a.outF in so de errores de ompilinD sern indidos en l slid estndrF n pr de ejemplos de funiones que retornn tipos ms omplejos que vo @voidA o nmeros enteros @intA se presentn ontinuinX

#include
/ en a t o f : un

` t y p e F hb
c o n v i e r t e un s t r i n g de s doble f l o t a n t e p r e c i s i n

punto

QT

double t o f @ char s A double vl D power Y int i D s i g n Y for


/ s a l t a e s p a c i o s en

blanco

Y s i g n a @ s i aa 9 9 A c I X I Y i f @ s i aa 9C 9 | | s i aa 9 9 A i CCY for @ v l a H F H Y i s d i g i t @ s i A Y i CCA vl a IHFH vl C @ s i 9H 9 A Y i f @ s i aa 9 F 9 A i CCY for @ power a I F H Y i s d i g i t @ s i A Y i CCA { vl a IHFH vl C @ s i 9H 9 A Y power a I H Y } return s i g n v l G power Y gdigo IWX tof propio

@ i a H Y i s s p e @ s i A Y i CCA

n funin similr se enuentr en un lireri estndr del pquete de instlion del ompildor de gD llmd stdlib.hF gomo se not en l delrin de l funinD st retorn un vlor de tipo doubleF gulquier progrm que l utilie dee onoer que retorn un vlor distinto un enteroF n progrm que puede her uso de l rutin atof es el de un lulE dor rudimentriX

#include `s t d i o F hb #define wevsxi IHH


min @ A {

sum a H Y while @ g e t l i n e @ l i n e D wevsxiA b H A p r i n t f @ 4 t 7 g n4 D sum Ca t o f @ l i n e A A Y return H Y QU

double sum D t o f @ char A Y char l i n e wevsxi Y int g e t l i n e @ char l i n e D int

mxA Y

} gdigo PHX gluldor rudimentri v delrin double sum, atof(char []); indi que l vrile sum es de tipo double y que l funin atof(char []) tom un rgumento de tipo char[] y retorn un rgumento de tipo doubleF st ltim dee ser delrd y de(nid onsistentementeF isto esD si en el prototipo de l funin se indi que retorn o tom prmetros de lgn tipo en prtiulrD l de(niin de l funin dee indir lo mismoD si no dr un error nivel de ompilinF v delrin y de(niin puede preer redundteD pero este es un esE tndr utilizdo por todos los progrmdores de este lengujeF isto permite reutilizin e inlusin e(iente de funionesF in so de no delrr un prototipoD se sume que l primer priin de l funin es el prototipoF hd l funin atof orretmente delrdD se puede de(nir ls atoi de l siguiente mnerX

int atoi(char s[]) { double atof(char s[]); return (int) atof(s); }


v expresin return expresionD indi que lo retorndo por tof@sA es onvertido en un tipo entero justo ntes de terminr de ejeutrF in est instruin se d l onversin de double intD est operin desrt prte de l informin por lo explido en previs seionesD pero olor expliE tmente el st elimin dvertenis nivel de ompilinF
6. Estructura de un programa

in generlD un progrm onst de un ierto nmero de funiones y un funin minF is usul que ests funiones sen grupds de uerdo un speto en omnD y s mismo distriuids entre distintos rhivos fuenE te identi(dos on un nomre nemnio que permit sumir que tipo de funiones se pueden enontrr llF he l mism mnerD es un estndr que d fuente teng un rhivo extensin Fh y F soidoF honde en el primer soD se inluyen l delE rin de vrilesD estruturs y funiones glolesF in el segundo soD se olo el digo soido d funin glol y otrs vriles o funiones loles neesrisF min es omn en el so de que pliqueD se teng un QV

rhivo on el odigo de l funin prinipl main()D unque pr st no se espei( el prototipoF

6.1. Variables externas


n progm en g onsiste de un onjuntos de ojetos externosD que pueE den ser vriles o funionesF e pueden de(nir vriles externsD omo quells delrds fuer del uerpo de un funin y que se enuentrn disponiles pr ulquierF in el so de ls funionesD siempre son exterE nsD y que g no permite que otrs funiones sen de(nids dentro de otrsF gulquier funin puede eder un vrile extern hiendo refereni por su nomreD si ste h sido delrdo en lgn puntoF i un ntidd grnde de vriles dee ser omprtid entre vris funionesD usr vriles externs es l mners ms onveniente y e(iente de herloF in emrgoD se dee ser prevido en herlo solo si es neesrioD y que si noD quedn muhs referenis intiles entre funionesF ists vriles son ideles deido su lne y tiempo de vidF isto esD utomtimenteD ls vriles delrds en un funin son internsD ells entrn en existeni undo se empiez l ejeuin de l funin y desE pree undo F or otro ldoD ls vriles externs son de existeni permnenteF n implementin del progrm de l luldor es mostrd onE tinuinD donde los operdores usn un notin in(j @iFeF @IEPAB@RCSA a I P E R S CB AF gd operndo es empildo y undo es un operdorD deE pendiendo si es unrio o inrioD l ntidd de operndos propidos son sdos de l pil pr plir l operinD este resultdo es empildoF v estrutur del progrm es un ilo que reliz l operin propid en d operdor y operndo l momento que se proesnF

while (existan operadores u operandos) if(numero) empilar; else if(operador) desempilar operandos aplicar operacion empilar resultado else if(nueva linea) desempilar tope de la pila e imprimir else error

QW

v uestin es deidir omo mnejr l pilF n posiilidd es delrrl en el minD y psrl omo prmetro ls funiones de empildo @pushA y desempildo @popA junto on l posiin tul del ltimo elemento edidoF ero min no neesit ser sore ls vriles que ontroln l pilD s que es mejor que sts sen vriles externs esiles por ls funiones pop y pushF il digo en g se muestr ontinuinX

#include #include
/ un tamao

`s t d i o F hb ` s t d l i F hb
mximo u de

para

a t o f ()

#define
/

operando

o pe ra do r

wey IHH
de que un fue e n c o n t r a d o

s e a l

#define

numero

xwfi 9 H 9

int g e t o p @ char A Y void push @ double A Y double pop @ void A Y


/ r e v e r s e P o l i s h c a l c u l a t o r

min @ A {

int type Y double opP Y char s wey Y while @ @ type a


{ {

g e t o p @ s A A 3a iypA

switch case

@ type A

xwfiX push @ t o f @ s A A Y break Y case 9C 9 X push @ pop @ A C pop @ A A Y break Y case 9 9 X push @ pop @ A pop @ A A Y break Y case 9 9 X RH

opP a pop @ A Y push @ pop @ A opP A Y break Y case 9 G 9 X opP a pop @ A Y i f @ opP 3a H F H A push @ pop @ A G opP A Y

else

break Y case 9 n 9 X

p r i n t f @ 4 e r r o r X z e r o d i v i s o r n4 A Y

} }

p r i n t f @ 4 t 7FVg n4 D pop @ A A Y break Y default X p r i n t f @ 4 e r r o r X unknown ommnd 7 s n4 D s A Y break Y HY gdigo PIX gluldor ol evers

return

is importnte destr que en el so de los operdores de rest y diE visin el orden dee ser distinguidoD es deirD es inorret l operin push(pop() - pop()) por esto se utiliz un vrile temporlF vs opeE riones de pil se de(nen ontinuinX

#define
/ v a l o r

weev IHH
maximo de p r o f u n d i d a d de la p i l a

int sp double void if


/

a HY / p r o x i m a v l weev Y /
empila f

p o s i c i o n p i l a

l i b r e

de

la

p i l a

push :

push @ double f A

else
}

@ sp ` weevA v l spCC a f Y p r i n t f @ 4 e r r o r X s t k f u l l D n 9 t push 7 g n4 D f A Y

RI

double
{

pop :

pop @ void A

d e s e m p i l a

r e t o r n a

e l

v a l o r

del

top

{ }

return else

if

@ sp b H A v l sp Y

p r i n t f @ 4 e r r o r X s t k emptyn4 A Y return H F H Y

gdigo PPX impildo y hesempildo he l mism mnerD l funin getop otiene el prximo operdor u operndoF v tre es filD solo dee ignorr los espios en lno y de tulinF edemsD si el rter no es un dgitoD retornrloF por otro ldoD oleionr un den de dgitos y retornr xwfiD l sel de que un nmero h sido enontrdoF

#include

` t y p e F hb

int g e t h @ void A Y void ungeth @ int A Y


/ getop : u o b t i e n e e l proximo numerico c a r a c t e r operando

int

g e t o p @ char s A

int i D Y while @ @ s H

a a g e t h @ A A aa 9 9 | | aa 9 t 9 A Y s I a 9 H 9 Y i f @ 3 i s d i g i t @ A 88 3a 9 F 9 A return Y / n o e s u n n u m e r o / i a HY if @ isdigit @A A / g u a r d a r l o s e n t e r o s / while @ i s d i g i t @ sCC i a a g e t h @ A A A Y i f @ aa 9 F 9 A / c a s o d e l o s r e a l e s / while @ i s d i g i t @ sCC i a a g e t h @ A A A Y RP

s i a 9 H 9 Y i f @ 3a iypA ungeth @ A Y return xwfiY gdigo PQX vetur de operndos y operdores

#define fpsi IHH char uf fpsi Y / b u f f e r / int ufp a H Y / p r o x i m a p o s i c i o n int


/ o b t i e n e

l i b r e

en

buf

{ }

g e t h @ void A

un

c a r a c t e r

return
c o l o c a

@ ufp b H A c uf ufp X g e t h r @ A Y
un c a r a c t e r en e l input

void if

ungeth @ int A

else
}

@ ufp ba fpsiA p r i n t f @ 4 ungeth X t o o mny h r t e r s n4 A Y

uf ufpCC a Y gdigo PRX vetur de rteres

in unto ls funiones getch y ungetch tmin se inluyen en un lireri estndr de gF

6.2. Archivos de Encabezado


iguiendo el ejemplo de l luldorD vmos dividir el progrm en distintos rhivos fuentesF v funin main se olo en un rhivo main.c Y ls funiones push y pop y sus vriles se uin en el rhivo stack.c Y getop se olo en getop.cF pinlmenteD getch y ungetch se uin en getch.cF ixiste lgn detlle ms por tomr en uentD ests son ls de(niiones y delriones omprtids entre los rhivosF he est mnerD se olorn ests instruiones omunes en un rhivo de enezdoD calc.hD resultndo enX

#define

xwfi 9 H 9 RQ

void push @ double A Y double pop @ void A Y int g e t o p @ char A Y int g e t h @ void A Y void ungeth @ int A Y
gdigo PSX vetur de rteres n vistzo generl de l estrutur del digo serX

r este progrm se pens ddo su tmo que solo er neesrio un rhivo de enezdoD sin emrgoD pr progrms ms extensos se onsej tener tntos rhivos de enezdo omo lo requier l estruturin del digoF

6.3. Estructura de Bloques


g no es un lenguje on estrutur de loques en el sentido de sl u otros lengujes similresD y que ls funiones no pueden ser de(nids en otrs funionesF or otro ldoD ls vriles pueden ser de(nids en un estrutur de loqueF n loque es un onjunto de instruiones enerrds entre llvesF or ejemploD ls vriles delrds en un loque slo existen dentro de lF

RR

if (n > 0) { int i; for (i = 0; i<n; i++) ... }


il lne de l vrile i se limit l loqueY es i no est reliond on lgun otr i fuer lF n vrile delrd e iniilizd en un loque se iniiliz d vez que se ejeutD por esto no es reomendle utilizr este estilo de progrmin l menos que se l inteninF or ejemploD

int x; int y; f(double x) { double y; }


in este soD ls ourrenis de l vrile x en el loque no se re(ere l enteroD si no l doleF efuer de l funin fD se re(ere l enteroF

6.4. Inicializacin
v iniilizin onsiste en drle un primer vlor un vrileD en l useni de un iniilizin explitD ls vriles externs y esttis se le d un vlor de ero por defetoF vs vriles eslres pueden ser iniilizds l ser de(nidsD seguid de un signo de iguldd y un expresinX

int x = 1; char squota = '\''; long day = 1000L * 60L * 60L * 24L; int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

6.5. Recursin
n funin reursiv posee en su uerpo llmds direts o indirets s mismF n lsio ejemplo de reursin es el lgoritmo de Quicksort desrrolldo por gFeFF rore en IWTPF RS

hdo un rregloD un elemento es elegido y el resto es prtiiondo en dos suonjuntosD en quellos menores y myores que el elemento pivoteF il mismo proeso es luego plido reursivmente los dos suonjuntosF gundo uno de los suonjuntos tiene menos de dos elementosD y no requiere ordenmiento y se detiene l reursinF v versin de uiksort que se present no es l ms rpidD pero es l ms simpleD y que se us el elemento medio pr her el prtiionmientoF

void

q s o r t :

q s o r t @ int v D

s o r t

v [ l e f t

int

] . . . v [ r i g h t ]

left D iD

int

en

orden

c r e c i e n t e

right A

int i D l s t Y void swp @ int if

v D

int
de

int

jAY

@ l e f t ba r i g h t A return Y / m e n o s

dos

e l e m e n t o s

}
/

swp @ v D l e f t D @ l e f t C r i g h t A G P A Y lst a left Y / a v [ 0 ] / for @ i a l e f t C I Y i `a r i g h t Y i CCA / if @v i ` v l e f t A swp @ v D CCl s t D i A Y swp @ v D l e f t D l s t A Y / r e s t a u r a e l e m q s o r t @ v D l e f t D l s t IA Y q s o r t @ v D l s t CID r i g h t A Y

p a r t i c i n

void

swap :

swp @ int v D

i n t e r c a m b i a

int

v [ i ]

iD

int

v [ j ]

jA

temp Y temp a v i Y v i a v j Y v j a temp Y gdigo PTX uiksort

int

v lireri estndr de g inluye un versin qsort que orden ojetos de ulquier tipoF il digo reursivo es ms ompto pero omo mntiene un pil neesit ms memori pr su ejeuinF

RT

6.6. El preprocesador de C
iste es el primer pso de l ompilinD ontiene un lenguje peulir distinto l usdo en un progrm en g regulrmenteD d expresin es denoE mind macroF elguns rterstis tiles son presentds en est seinF

6.6.1. Inclusin de Archivos


ist diretiv indi qu rhivo se dese inluir l rhivo fuenteD existen dos forms en que puede ser dd #include ''archivo'' o #include <archivo>F i el prmetro rhivo se enuentr entre omills dolesD indi que este rhivo se enuentr en un rut de rhivos inusul o elegid por el usurioF in el otro soD indi que el rhivo se enuentr en un diretorio onoido por el ompildorD en generl el diretorio de instlinF sulmente se enuentrn numeross lnes de inlusin l iniio de un rhivo fuenteD pr inluir diretivs de tipo #define y delriones de tipo externD o pr eder prototipos de funiones de ls lireris ms omunes omo <stdio.h>F ist diretiv es til y que permite unir delriones de funiones en el so de un digo extenso y le d entendimiento l progrmF

6.6.2. Substituciones Macro


#define nombre texto de reemplazo iste es l vriin ms simple de este tipo de mrosF isto indi que tods ls ourrenis del string nomre ser reemplzdo por texto de reemplzoF in generlD nomre tiene l form de un vrile regulr y el texto de reemplzo es ritrrioF xormlmente ste tom el vlor hst undo l lineD sin emrgoD se puede seprr en lines siempre y undo se oloque entre d lne el rter  9F he mner estndrD sts son delrds en mysulF or ejemploD si se de(ne el string iD no se sustituye en los strings entre dole omills y sustrings omo printf("YES") o YESMANF gulquier string y texto de reemplzo puede ser usdoD por ejemploX #define forever for (;;) min es posile de(nir mros on rgumentosD de mner que el texto de reemplzo se distinto de uerdo l rgumentoX #define max(A, B) ((A) > (B) ? (A) : (B)) i se sign lo siguienteX x = max(p+q, r+s); er reemplzd por l lne x = ((p+q) > (r+s) ? (p+q) : (r+s));
RU n de(niin tiene l form

i se exmin el mroD se puede notr que ms expresiones son evE luds dos veesD por ejemplo l llmd max(i++, j++) es errne y esto inrementr l vrile i e j en el doleF he mner ontrriD los nomres pueden ser inde(nidos undo se reE querido on l diretiv #undef

6.6.3. Inclusin Condicional


is posile ontrolr el preproesmiento on un ondiionl que son evE ludos durnte est etpF isto provee un mner de inluir digo seletiE vmenteD dependiendo del vlor de l ondiin evlud durnte l ompiE linF v diretiv #if evl un expresin que result en un enteroF i l expresin es diferente de eroD l lnes siguientes hst un #endif o #elif o #else son inluidsF v expresin defined(nombre) en #if es I si el nomre no h sido de(nidoD en so ontrrioD es eroF or ejemploD pr segurrse que el ontenido del rhivo hdr.h se inE luid extmente un vezD el ontenido de todo el rhivo dee roderse de un ondiionl sX

#if !defined(HDR) #define HDR ... #endif


hurnte el preproesmientoD el primer rhivo que hg l inlusin de hdr.h de(ne l vrile HDR Y ls siguientes inlusiones que hgn otros rE hivos onseguirn que est vrile se enuentr de(nidD s que sltr l prte del digo hst #endifF isto pr evitr inluir un rhivo muhs veesF i este estilo se sigue de mner onsistenteD el progrmdor no dee estr preoupdo en unts vees inluy un rhivo o noF v siguiente seueni heque iw y deide que versin del enE ezdo inluirX

#if SYSTEM == SYSV #define HDR "sysv.h" #elif SYSTEM == BSD #define HDR "bsd.h" #elif SYSTEM == MSDOS #define HDR "msdos.h" #else #define HDR "default.h"
RV

#endif #include HDR


he l mism mnerD existen dos diretivs #ifdef y ifndef que son n ms espe(s ddo que veri(n si un nomre y est de(nidoF ytr mner de relizr lguno de los ejemplos previos puede serX

#ifndef HDR #define HDR ... #endif

RW

7.

Apuntadores

7.1. Qu es un apuntador?
il lenguje de progrmin g est repleto de puntdoresF is relmente imposile dominr este lenguje sin entender ompletmente qu son los puntdoresF il prolem de los puntdores es que l myor de l gente que proE grm no tiene un onoimiento sio de mo se mnejn ls vriles en el lenguje gF n vrile es simente un ontenedor delrd de un tipo @intD shortD longD etA dnde se puede lmenr informinD que es vE rile en el tiempoF isto se d porque el lenguje g funion en un mundo intermedioD entre l progrmin de lto nivel y el mundo de los itsF gundo se delr un vrile en gD se le sign un tipo y un nomreF or dejo el ompilr reserv un espio en memori del tmo de l vrile desed @ver gdigo PD pgin WA F i no se le sign un vlor l vrile inmeditmenteD el espio sigue reservdo @n rzn muy fuerte pr no delrr vriles que no se usnAF n vez signdo un vlorD el espio en memori mntiene est informin en el formto y on los lmites neesriosF i se onsider un vrile regulr de gD que tiene un espio en meE mori donde se gurd el ontenido y un direin de memori que indi dnde est l informinD un puntdor es un tipo de vrile que ontiene un direin de memori pr llegr un ontenidoF odos los tipos de g tienen puntdores y existen diverss forms de delrr ests vrilesD tods reonoids por el ompildor de gX

int* ptr; int *ptr; int * ptr;


r mntener l onsisteniD l delrr l vrile puntdor se usr en est gui l siguienteX

int *ptr;
in gD ls vriles delrds sin signin inmedit son iniilizds por el ompildor un vlor predetermindoF r los tipos nmerios @intD )otD douleA el vlor es l representin del HF r tods ls vriles tipo puntdor este vlor es NULLF n vez delrd un vrile de tipo puntdor no es neesrio usr * pr l signinD y que despus de l signin ptr es siempre un SH

vrile tipo apuntador a algoF i se us * ntes de un vrile esto tiene un signi(do ompletmente diferenteD que se desriir ms delnteF ixisten dos operdores unrios importntes l hlr de puntdoresF no es & y el otro es l mism * usd pr delrr vriles de tipo puntdorF hemos diho que tod vrile en g tiene reservdo un pedzo de l memori existenteF omndo eso en uent tiene que her un form de otener l direin de l memori donde est lmendo un informinF il operdor & he justmente estoF nido un vrile ulquierD usndo este operdorD se otiene l direin de memori donde est l informinF n ejemplo es l siguiente line de digoX

(...) int k = 6; printf("La direccion de k es: %p\n", &k); (...)


n vez que se tiene un vrile tipo puntdorD el gregrle un * durnte su signin o utilizrl dentro del digoD lo defereniF fsiE mente *ptr fet el ontenido del espio de memori donde punt ptrF n ejemplo pequeo se muestr joX

(...) int *ptr; int k; ptr = &k; *ptr = 8; (...)


r onretr ests idesD mostrmos el siguiente ejemploX I P Q R S T U V W IH II

#include `s t d i o F hb int j D k D int p t r Y int


mY

min @ void A { j a k a ma ptr IY PY QY a 8k Y SI

IP IQ IR IS IT IU IV IW PH PI PP }

k a mY p r i n t f @ 4 n4 A Y p r i n t f @ 4 j t i e n e e l v l o r 7 d y e s t lmendo en 7 pn4 D j D @ void A8j A Y p r i n t f @ 4k t i e n e e l v l o r 7 d y e s t lmendo en 7 pn4 D k D @ void A8k A Y p r i n t f @ 4m t i e n e e l v l o r 7 d y e s t lmendo en 7 pn4 D m D @ void A8 mA Y p r i n t f @ 4 p t r t i e n e e l v l o r 7 p y e s t lmendo en 7 pn4 D ptr D @ void A8p t r A Y p r i n t f @ 4 il v l o r d e l e n t e r o puntdo por p t r e s 7 d n4 D p t r A Y

return

HY gdigo PUX ijemplo de puntdores

in este ejemplo tenemos ls delriones de ls vriles jD k y mF in ls lines U y V del digo IW tenemos que se le sign jD k y m on ID P y Q repetivmenteF in l line Q se delr un tipo nuevo de vrile del tipo int *F isto se denomin un vrile puntdorF v * signi( que l vrile es de tipo puntdorD el nomre soidoD en este so intD muestr que tipo de informin punt l vrileF vuego se le sign ptr l direin de k en l line IHF isto es seguido por un signion de m kF vo que sigue es l impresin en l pntll de los vlores que rroj orrer este progrmF r poder nlizrlo y trtr de entender por ompleto l teori de puntdoresD mostrmos l slid joX

[hola@maquina]$ ./apuntador j tiene el valor 1 k tiene el valor 3 m tiene el valor 3 ptr tiene el valor El valor del entero y esta almacenado en 0x8049744 y esta almacenado en 0x804974c y esta almacenado en 0x8049750 0x804974c y esta almacenado en 0x8049748 apuntado por ptr es 3

gomo pueden preirD los vlores que resultn de l orrid del progrm son los desedosF vo importnte notr es l difereni entre l signin heh ptr en l line IH y l posterior signin de k mF isto refuerz SP

l ide de que un vrile tipo puntdor slo tiene l informin sore dnde est el ontenido de lgo y que de l primer signin de P kD ste se onvierte en Q y mi el ontenido l que punt tmin ptrF isto se puede ver en l lne de slid nmero R donde l direin en memori es igul l direin de l vrile kF in el digo IW tmin se muestrn los usos de & y * en l line IQ hst l IVF v ide de puntdores no es fil de entender y slo on l prti se puede reforzr este oneptoF mese un tiempo pr digerir l informin de est sein ntes de psr ms delnteF

7.2. Apuntadores y estructuras de datos


vs estruturs de dtos son eseniles pr poder relizr lulos y oss interesntes en los progrms de omputdorF in el so del lenguje de progrmin g ls estruturs de dtos estn ompletmente ligds l ide y l uso de los puntdoresF i ien existe un ptulo ms extenso sore estruturs de dtos en est guiD est sein se enrgr de trtr de unir l ide de puntdores l de estruturs de dtosF gomenzremos on l estrutur de dtos ms siX los rreglosF

7.2.1. Arreglos
il rreglo es l estrutur de dtos ms si en omputinF v ide de un rreglo es senillF smgnese los vgones de un trenD d uno on un nmeroD siendo H el primer vgnF in d vgon se puede meter lgun ontenidoD pero todos los ontenidos del tren tienen que ser del mismo tipoF e difereni de otros lengujes de progrmin los rreglos en g dee ser iniilizdos siendo su tmo mximoF n ejemplo esX

int miarreglo[10];
in este ejemplo se re un rreglo de enteros on IH sillsD del H l WF ytro ejemplo esX

int miarreglo[] = {4, 5, 7, 8};


in este ejemplo se re un rreglo de R sillsD del H l QD on ontenido de RD SD U y VF SQ

estryndonos l nivel de gD se puede deir que un rreglo de tmo xD dee reservr x espios de memori de un tmo desedoF ree lgio que estos espios de memori se reservsen de form ontinuF in efeto esto es lo que ps en gF r poder ver omo entr en juego los puntdores mostrmos el ejemplo de omo iterr por ls sills de un rregloF

#include `s t d i o F hb int int


mirreglo a {I DPQ DIU DR D S DIHH}Y min @ void A {

int for

iY

p r i n t f @ 4 nn4 A Y @ i a H Y i ` T Y i CCA { p r i n t f @ 4 m i r r e g l o 7d a 7 dn4 D i D m i r r e g l o i A Y } return H Y gdigo PVX sterin de un rreglo medinte sills

in este ejemploD se us l teori de sills pr iterr por el rregloF il for es simple y imprime en l pntll el vlor de miarreglo[x] donde x tom un vlor del H l S @por lo tnto son T vloresAF eroD si l informin en memori est puest seuenilmenteD no hE r un form de usr puntdoresc in g todo es posileF i se reuerdnD en l sein nteriorD se hl sore los tmos de ls vriles y sore su reservin en memori l momento de delrrls @iniilizds o noAF i se delr un rreglo de enteros @intA miarreglo de T sillsD esto signi( que el ompilr est reservndo TBsizeof@intA @ver digo PD pgin WA espio en memoriF gon un poo de ritmti simple nos dmos uent que d sill del rreglo tom sizeof@intA y que si hemos 8mirregloHD nos dr l direin en memori de l primer sill3 i nos queremos entusismr ms podemos pensr que si tenemos l diE rein de 8mirregloH y summos un sizeof@intAD nos dr l direin de l segund sill del rreglo3 in efeto es sF i nos ponemos pensrD esto ser un poo tedioso pr herD y que impli un ritmti en hexdeE iml @es l form en l que se lsi(n los espios de memoriA por lo que SR

no es intuitivo inluso pr el progrmdor ms experimentdoF gundo uno re un tipo puntdor en gD prte de delrr que l vrile es de tipo puntdor on * se le sign un tipo de vrile @intD )otD hrD etAF isto se he no solo por l legiilidd del digo sino tmin pr poder usr los puntdores en ontextos ms vridosD omo pr iterr dentro de un rregloF gomo el puntdor tiene signdo un tipo y tods ls vriles en g pueden prtiipr en operiones ritmtisD es posile lo que se muestr joX I #include `s t d i o F hb P Q int m i r r e g l o a { I D P Q D I U D R D S D I H H } Y R int p t r Y S T int min @ void A { U V int i Y W p t r a 8m i r r e g l o H Y IH II p r i n t f @ 4 nn4 A Y IP for @ i a H Y i ` T Y i CCA { IQ p r i n t f @ 4 ptr C 7 d a 7 dn4 D i D @ p t r C i A A Y IR } IS return H Y IT } gdigo PWX sterin de un rreglo medinte puntdor uxilir vo interesnte de este digo es que tenemos lgo equivlente l digo previoD pero de un form ompletmente nuevF vo importnte de este diE go es l line IRF hentro del printf hy un expresin summente onit que die *(ptr + i)F i nos reordmos de l sein nterior *ptr nos llev l ontenido @vlorA que nos punt ptrF ehor si le sumo un nmero entero ptr ntes de pedir el ontenidoD qu es lo que est psndoc v respuest viene dd por l delrin del puntdor on un tipoF i tenemos un puntdor tipo entero @omo es el so rriA el espio de ese vlor v venir ddo por sizeof@intAF intones si ptr se le greg el sizeof@intAD psr otro espio de memori donde podra omenzr otro vlor de enteroF eunque esto no es reomndle en muhs osionesD en el so de rreglos es perfetoF r filitr este luloD g viene inorpoE rdo on aritmtica de apuntadoresF isto signi( que ddo un puntdor delrdoX SS

hola *ptr;
v expresinX

ptr + 1
se resolver on l euinX

ptr ahora apuntar a = direccion ptr + sizeof(hola)


pr un vrile hol ulquierF ge destr que ls operionesX

ptr++ ++ptr ptr---ptr


son tmin vlids dentro de gF r que tener uiddo on ests y que su ejeuin mi en que momento de l ejeuin se le greg @o restA l puntdorF euerdense que si uno por error intent eder un espio de memori no reservdoD el progrm explotD en el so de eder un espio reservdo pr otr vrileD pueden psr oss interesntesD pero difiles de orregirF i hn entendido el onepto hst horD se preguntrn mo es que on un rreglo puedo her miarreglo[x] donde x es un nmero de(nido dentro del rreglo y mo es que puedo usr un puntdor pr her extmente lo mismoF isto se dee que l delrin de un vrile tipo rreglo es en verdd un puntdorF r demostrrlo tenemos este ltimo pedzo de digoX

#include `s t d i o F hb int int


mirreglo a {I DPQ DIU DR D S DIHH}Y min @ void A {

int

iY

p r i n t f @ 4 nn4 A Y for @ i a H Y i ` T Y i CCA { p r i n t f @ 4 m i r r e g l o 7d a 7 dn4 D i D @ m i r r e g l o C iAAY ST

pigur IX vist enlzd simple } }

return

HY

gdigo QHX sterin en un rreglo usndo el rreglo omo puntdor iste digo es ompletmente nlogo l digo PI en l pgin RPF xuevmente se sugiere sentrse pensr sore est suseinD trtndo de entender en d ejemplo ddo lo que est psndoD pso psoF n vez que quede lro este onepto podemos psr ls estruturs ms vnzE dsF

7.2.2. Lista enlazada


entes de (nlizr l prte de puntdores ser interesnte poder rer un estrutur si utilizndo los onoimientos dquiridos de puntdores y estruturs elementlesF `Fmine aaaaaaa v ide de un list enlzd es muy simple omo lo re)ej el siguiente diujoX  9vo que se tiene es un estrutur si tipo registroD donde el nodo ontinene un informin y l informin de donde se enuentr el prximo nodoF  9r poder omenzr rer un list neesitmos un registro primrio que luego pued onvertirse en nuestro nodoF sndo nuestro onoimiento de struts y puntdoresD podemos her un primer intentoX  9ist onstruinD omo se vi en el ptulo de estruturs delr un registro que luego se puede delrr omo nodo que v ontener dos tipos de dtosF n espio pr gurdr l informin de un entero y l informin de dnde enontrr el prximo nodo en l memoriF  9r poder utilizr nuestro nuevo registro de un form interesnte teE nemos que poder insertr informin nuev nuestr listD eliminrD usr e imprimir el ontenido de l mismF isto no es di(ilD y lo trtremos de desglosr de l mejor mner posileF  9r rer un nodo nuevo en un progrmD es su(iente herX  9v onfusin ms omn es por qu se re un puntdor nodo y no simplemente un nodoF isto depende fuertemente de omo se quier trtr el nodo dentro del progrmF in este soD se quiere her ls modi(iones sore un nodo @y posteriormente de un listA en form de funinF heido esto es preferile usr un puntdor nodoF SU

 9r poder gregr l nodo un vlorD omo est en xvvD se dee iniilizr l vrileF gomo se quiere reservr un espio dinmio pr nuestr estruturD se requiere de un mllo del tmo de nodoF n vez reservdo el espioD se deer signr un vlor l ontenedor que tiene el nodoF odo esto se puede herD rendo un funinX   bFrSI

7.3. Apuntadores y strings


in g no existe l noin de tring omo en otros lengujes de progrE minF isto se dee l ide de que g est lo ms er del lenguje emsmldor sin di(ultr l tre de her oss de lto nivelF or lo tnto en g no existe l ide de trings sino de rreglos de rteresF in gD el texto se delr omo un rreglo de rteres y por lo generl son iniilizdos de l formX

char mistring[40] = "Hola"


isto re un rreglo de RH sills de tmo sizeof@hrAD donde los primeros S rteres son Hola\0F il resto del espio estr ompletmente en lnoF il fmoso \0 es utomtimente gregdo l rreglo si se usn dole omills en l delrin del rregloF iste rter no ser impreso en un printf pero muestr el (nl del espio utilizdo en un rreglo de rteresF

#include `s t d i o F hb int char char


min @ A { o n t e n e d o r S H a 4 rol e s t o e s un prue 4 Y ontenedorP S H Y
/ / apuntador apuntador a a un t i p o char

pe a o n t e n e d o r Y / a p u n t a p A a c o n t e n e d o r / printf @4 7 s b wuestr l o que punt t i e n e o n t e n e d o r n4 D o n t e n e d o r A Y printf @4 7 s b wuestr l o que punt pen4 D peA Y pf a o n t e n e d o r P Y p r i n t f @ 4 n4 A Y
/ apunta pB a c o n t e n e d o r 2

char pe Y char pf Y

/ /

otro

t i p o

char

while @ pe

3a 9 H 9 A { SV

pfCC a peCCY

pf a 9 H 9 Y printf @4 7 s b wuestr l o que punt o n t e n e d o r P l f i n l de todo F n4 D ontenedorP A Y return @ H A Y


gdigo QIX helrndo y imprimiendo un rreglo de hr @tringA

vo importnte es ver qu mo l vrile 7s en printfD imprime el rreE glo de hr sin prolemF mien hy un fuerte uso de puntdores y de sus signionesF pjese ien lo que ps dentro del ilo del whileF equi se est signndo d sill del ontenedorP l informin de l vrile onE tenedorF min muy importnte es el gregdo del  \H despus de her opido rter por rterF i ien esto no es omo se opir un rreglo normlmente en gD es un demostrin muy interesnte de omo los rreglos de hrD los puntdores y los strings estn unidos en este lengujeF

SW

8.

Herramientas

8.1. Makele
n rhivo Makele es un espei(in de dependenis entre rhiE vos y de mo resolverls pr logrr un ojetivo glolF istos rhivos son proesdos por l utilidd makeD disponile es ulquier sistem xsF il progrm mke tuliz todos los ojetivos trvs de l tulizE in de tods sus dependenisF n grfo potenilmente omplejo es formdo undo se reliz el proesmiento de estos rhivosF n ejemplo senillo esX l l X foo f o o X f o o F o r F o z F o FFoX 6 @ggA 6 @gpveqA 6` o 6dd F l FX 6 @viA 6` 88 mv l e x F yy F 6dd gdigo QPX ijemplo enillo wke(le il grfo de fuentes soido este ejemplo esX

qenerlmenteD todos los ojetivos se sumen nomres de rhivosD y ls regls deen espei(r mo rer o tulizr estos rhivosF gundo se lleg los nodos hojsD omo se ve en el gr(o previoD el wke(le dee inluir un onjunto de omndos de shell que permite generr o tulizr estos rhivosF v tulizin de los ojetivos signi( que el tiempo de ltim modi(in de ls dependenis se ms reiente que el ojetivoF sgulmenteD se pueden espei(r regls que sern ejeutds inondiioE nlmenteD por ejemploX TH

clean: rm *.o core


isto indir que l ejeutr el omndo make cleanD se orrrn los rhivos on extensin Fo y el llmdo oreF vos omentrios de un rhivo wke(le omienzn on el rter 5 hst el (nl de l lneF il siguiente ejemplo muestr tres ojetivos indiviE dules on dependenis individulesX

target1: dep1 dep2 ... depN <tab> cmd1 <tab> cmd2 <tab> ... <tab> cmdN target2: dep4 dep5 <tab> cmd1 <tab> cmd2 dep4 dep5: <tab> cmd1
vos ojetivos deen estr l omienzo de un line y son seguidos de dos puntosF vuego sigue un espio en lno y el onjunto de dependenis seprds por un espio en lnoF in l lne siguiente vn los omndos de shell que deen ser ejeutdosD es importnte onoer que st lne dee tener omo pre(jo un espio de tuldorD este es un error muy omn en nuevos usuriosF is deirD no se aceptan varios espacios en blanco, solo un tabF edemsD en estos rhivos se pueden usr ierts mrosD sts empiezn on un signo de dlrF or ejemploX $(CC) $(CFLAGS) -c $< -o $@F equ ls form sintti 6@FFA indi expnsin de vrilesF n vrile se puede de(nir de l siguiente formX VAR=VALORD

CC=gcc el ser proesdoD donde se hy espei(do l vrile 6@ggA se sustituye literlmente on el vlor gF wke tiene un onjunto de vriles de(nids por defetoD el vlor primrio de 6gg es F vs mros ms omunes son 6d y 6`F sts representn los nomres de los ojetivos y l primer dependeni de l regl en l que preeF in el siguiente wke(le se puede ilustrrD
l l X dummy TI

deho 46d depends on 6`4 dummy X touh 6d gdigo QQX ijemplo enillo wke(le el ejeutr el omndo mkeD l slid esX

$ make touch dummy all depends on dummy

TP

8.2.

Debugging con gdb

el esriir un progrm !en ulquier lenguje! suele ourrir que omeE temos erroresF vos progrms esritos pueden tener un omportmiento difeE rente l que espermos deido que nuestro lgoritmo er inorreto o que nos equivomos l esriirloF il proeso de depurinD ms omnmente onoido omo debugging onsiste en l squed y eliminin de errores en un progrm y esritoF hdo que relizr deugging de un progrm puede llegr ser un tre muy tediosD existe un vriedd de herrmients que yudn en el proesoF in prtiulr est disponile GDBD un deugger que form prte del proyeE to qxF ste permite exminr l ejeuin de un progrm mientrs est ejeutndose o l her termindo su ejeuinF ermite detener el progrm en puntos espei(dos pr oservr su estdo e intentr lolizr l fuente de ulquier error detetdoF r que nuestro progrm ejeutle onteng informin de deugging que nos yude durnte el uso de qhfD deemos ompilr usndo l opin -ggdb de gccF or ejemploD podemos herX

gcc o bugs -ggdb bugs.c


r exminr este progrm on gd hemosX

gdb bugs
el her esto estremos frente un prompt de gd en el ul podemos esriir omndosF ry un grn ntidd de omndos disponilesY los usuE rios ms experimentdos tienen muhs posiiliddes l utilizr est herrE mientF in emrgoD onoiendo un pequeo onjunto de omndos imporE tntes podemos provehrlF or supuestoD l mejor mner de prenderlos es usndolosF ixperimente on los siguientes omndosF uede utilizr el omndo help pr otener ms yud sore d unoF inuentre los errores en el progrm QSD que intent enontrr el menor nmero n tl que (@nA es myor que IHHHHHHHF rek print disply t list TQ

run set rgs next step

#include
{

`s t d i o F hb

int

f i @ unsigned

int

nA

if if

@ n aa H A

return return

HY IY

@n a IA

} {

return

f i @ n IACf i @ n PA Y

int

min @ int rg D

char

rgv A

int
{

i a H D enontrdo a H Y @ enontrdo a HA @ f i @ i A b IHHHHHHHA enontrdo a I Y

while
{

if

p r i n t f @ 4 f i @ 7d A a 7 dn4 D i D f i @ i A A Y }

return

HY gdigo QRX progrm inorreto

r empezr podemos de(nir un breakpoint l entrr minF isto hr que el progrm se deteng hD lo que nos permite ver l ejeuin pso pso desde el prinipioF isto se puede her esriiendo TR

break main
oD ddo que min empiez en l lne IRD

break 14
reho estoD esriimos

run
pr iniir l ejeuin del progrmF ste se detendr inmeditmenteD permitindonos drle ms omndos qhfF odemos usr los omndos print y display pr ver el ontenido de un vrile ddF next y step vnE zn un pso en l ejeuinF

TS

9.

Ejercicios

IF isri un funin strindex(s,t) que retorne l posiin de l ourrenE i uid ms l derehD del elemento t en el string sF in so de que hy ningun ourreni retornr eroF PF isri un funin similr l estudid previmente atof pr mE nejr l notin ient( de l formX IPQFRSeETD undo un punto )otnte este seguido de un e o E y opionlmente un signo en el exponenteF QF he(n un mro swp@tDxDyA que intermie dos rgumentosD x e yD de tipo tF RF isri un progrm pr omprr dos rhivosD imprimiendo ls priE mero lne donde di(erenF SF wodi(que el progrm de Grep propio ddo en ptulos previosD que tomen omo entrd de prmetros un onjunto de nomres de rhivos y usque el ptrn en todos esos rhivosF TF isri un progrm que imprim en pntll un onjunto de rhivosD entre d rhivo dee imprimir un lne en lno y se dee indir el nomre del rhivo orrespondiente en l slidF

TT

You might also like