A toda variable que se use en un programa, se le debe asociar
(generalmente al principio del programa) un tipo de dato especfico. Un tipo de dato define todo el posible rango de valores que una variable puede tomar al momento de ejeui!n del programa " a lo largo de toda la vida #til del propio programa$ %os tipos de datos m&s omunes en C++ son' TIPO DATO !PA"IO ##O$IA $A%&O unsigned c'ar ( bits ) a *++ c'ar ( bits ,-*( a -*. s'ort int -/ bits ,0*,./( a 0*,./. unsigned int 0* bits ) a 1,*21,2/.,*2+ int 0* bits ,*,-1.,1(0,/1( a *,-1.,1(0,/1. unsigned long 0* bits ) a 1,*21,2/.,*2+ enum -/ bits ,*,-1.,1(0,/1( a *,-1.,1(0,/1. long 0* bits ,*,-1.,1(0,/1( a *,-1.,1(0,/1. float 0* bits 0.1 3 -),0( a 0.1 3 -)40((/ dec) double /1 bits -.. 3 -),0)( a -..5-)40)((-+ dec) long double () bits 0.1 3 -),120* a -.- 3 -)4120* void sin valor
Para manejar adenas de arateres (strings)* se debera usar un arregllo de arateres on el siguiente formato$ C+ar nomstring,ant de elementos-. Ejemplo C+ar nombre,/0-. C+ar iudad,10-. Para argar on un dato se usa el siguiente odigo. strp"(arrera*2ing sistemas2). 3ariables arreglos de arateres* tienen que usar sus funiones de manipulai!n que vienen en la libreria string$+* algunas de estas funiones son' strp"()* strat()* strmp()* strlen()* et$ Estrutura de Datos' Una estrutura de datos es una manera de almaenar " organi4ar datos para failitar el aeso " modifiaiones$ 5o +a" una estrutura de datos que sirva para todos los prop!sitos* " por eso es importante saber sus ventajas " desventajas$ Este doumento es una olei!n de apuntes para el urso de Estruturas de Datos$ %os apuntes se +an tomado de algunas fuentes que son detalladas en la sei!n de bibliograf6a$ Arreglos Definicin 1 Un arreglo se compone de elementos de igual tamao almacenados linealmente en posiciones de memoria consecutiva. Se puede aeder a ada elemento de datos individual utili4ando un sub6ndie* o 6ndie* para seleionar uno de los elementos$ En "6"44 * un arreglo no es un tipo de datos est&ndar. es un tipo agregado ompuesto de ualquier otro tipo de datos$ %os arreglos se pueden definir usando tipos de datos mi7tos debido a que se supone que todos los elementos son del mismo tama8o$ Puesto que todos los elementos son del mismo tama8o " "a que este +e+o se utili4a para a"udar a determinar !mo loali4ar un elemento dado* resulta que los elementos son almaenados en loalidades de memoria ontiguas$ %o m&s importante a tener en uenta es' El nombre de un arreglo es visto por el ompilador omo un puntero9onstante al primer elemento del arreglo$ Esto es mu" importante' a) El nombre del arreglo es visto omo un tipo puntero* " m&s espe6fiamente* b) un puntero onstante 9signifia una direi!n de memoria bloqueada para el primer elemento de un arreglo9$ Por ejemplo* aunque una delarai!n de arreglo toma la f!rma gen:ria' Tipo7lementoArra8 %ombreArra8 9 %umeroDelementos : El ompilador ve la delarai!n omo Tipo7lementoArra8 5 const %ombreArra8 ; <%ombreArra89):= Por esta ra4!n* un identifiador de arreglo no puede ser usado nuna omo un valor-i (valor i4quierdo)$ %os valores i4quierdos representan variables que su ontenido puede ser alterado por el programa. freuentemente apareen a la i4quierda de las sentenias de asignai!n$ Si los nombres de arreglo fueran variables i4quierdos permitidos* el programa podr6a ambiar sus ontenidos$ float !alariosDempleados9#a37empleados:= . . . !alariosDempleados ; 1+.02.)= El efeto +ar6a ambiar la direi!n iniial del propio arreglo$ Declaraciones de un arreglo %a sinta7is de delarai!n de arreglos es' tipo nombre7arreglo 9numero7de7elementos:= %os siguientes son dos ejemplos de delaraiones de arreglos v&lidas en "6"44 ' int "oordenadasDePantalla9+:= 65>n arreglo de + enteros 56 c'ar ID"ompania9*):= 65>n arreglo de *) caracteres 56 Figura 1: Arreglo "oordenadasDePantalla on 6ndies de despla4amiento v&lido En la figura ; se muestra el primer arreglo que fue delarado on el tipo de n#meros enteros* llamado "oordenadasDePantalla* oupa en memoria < loalidades de memoria ontiguas* ada una de ellas apa4 de almaenar un n#mero entero$ Atualmente es om#n que los n#meros enteros sean de /1 bits* esto +ae que el arreglo "oordenadasDePantalla oupe bits 5o se permite utili4ar nombres de variables dentro de los or+etes$ Por esto no es posible evitar la espeifiai!n del tama8o del arreglo +asta la ejeui!n del programa$ %a e7presi!n debe ser un valor onstante* para que el ompilador sepa e7atamente u&nto espaio de memoria tiene que reservar para el arreglo$ Una buena pr&tia de programai!n es usar onstantes predefinidas$ ?define "oordenadas7#a3 *) ?define Tamano7#a@7"ompania7Id -+ int "oordenadasDePantalla9"oordenadas7#a3:= c'ar ID"ompania9Tamano7#a@7"ompania7Id:= El uso de onstantes predefinidas garanti4a que futuras referenias al arreglo no e7edan el tama8o del arreglo definido$ Iniciacin del arreglo "6"44 proporiona / maneras de iniiar elementos del arreglo' Por defecto: Cuando son reados* se aplia solamente a arreglos globales " est&tios$ Explcita: Cuando son reados* suministrando datos de iniiai!n Tiempo de ejecucin: Durante la ejeui!n del programa uando se asignan o opias datos en el arreglo$ Acceso a los elementos de un arreglo Si se tiene un error uando se utili4an arreglos en "6"44 * de seguro el error involura el aeso a los elementos del arreglo* por la simple ra4!n de que el primer elemento est& en una posii!n 0* no ;$ De manera que el #ltimo elemento del arreglo lo enontramos en n,-* donde n es el n#mero de elementos$ Supongamos la siguiente delarai!n' int stado9$ango7#a3imo7stado:;A,-,),-B= %a siguiente sentenia tiene aeso a 9;' stado9):= Si esribimos stado90: ausar& un error porque no +a" = elementos$ Clculo del tamao de un arreglo (sizeof()) Es freuente utili4ar el operador siCeof() para alular la antidad de espaio que se neesita almaenar para un objeto' 65 5 e3ploresC.cpp 56 ?includeDiostream.'E ?define ma3Dias!emana . int main(void)A int desplaCamiento, ma3ForasDiarias9ma3Dias!emana:= coutDDGsiCeof(int) esGDD(int)siCeof(int)DDGHnHnG= for(desplaCamiento;)=desplaCamientoDma3Dias!emana= desplaCamiento44) coutDDG<ma3ForasDiarias9G DDdesplaCamiento DDG:;G DD<ma3ForasDiarias9desplaCamiento:DDGHnG= return )= B Arreglos multidimensionales El t:rmino dimensin representa el n#mero de 6ndies utili4ados para referirse a un elemento partiular en el arreglo$ %os arreglos de m&s de una dimensi!n se llaman arreglos multidimensionales$ 65 6 dosDim.cpp 56 ?include DiostreamE ?define numIilas 1 ?define num"olumnas + int main (int argc, c'ar 5 const argv9:) A int despIila, desp"olumna, desplaCamiento, multiplo, desp"alculados9numIilas:9num"olumnas:= for(despIila;)=despIilaDnumIilas=despIila44) for(desp"olumna;)=desp"olumnaDnum"olumnas=desp"olumna4 4)A desplaCamiento;num"olumnas,desp"olumna= multiplo;despIila= desp"alculados9despIila:9desp"olumna:; (despIila4-)5desp"olumna4desplaCamiento 5 multiplo= B= for(despIila;)=despIilaDnumIilas=despIila44)A stdJJcoutDDGIila actualJ GDDdespIilaDDGHnG= stdJJcoutDDGDistancia relativa desde la baseJ GDDGHnG= for(desp"olumna;)=desp"olumnaDnum"olumnas=desp"olumna4 4) stdJJcoutDDG G DDdesp"alculados9despIila:9desp"olumna: DDG G= stdJJcoutDDGHnHnG= B return )= B B Arreglos como argumentos de funciones Es neesario reordar tres osas al pasar arreglos omo par&metros de funiones' ;$ Todos los arreglos son pasados en llamada9por referenia$ 1$ Debido a que el arreglo es pasado en llamada por referenia* ser6a inorreto para la funi!n llamada devolver el arreglo en una sentenia return()=$ Esta sentenia est& de m&s$ /$ Todos los elementos del arreglo son pasados a las funiones en llamada por valor$ lo que signifia que se pasa una opia del elemento* no la direi!n del elemento$ 65 66 ereArra8.3code 56 ?include DiostreamE ?include Dct8pe.'E ?define ma3Arra8 + void Arra8#a8uscula(c'ar Arra89ma3Arra8:)= int main (int argc, c'ar 5 const argv9:) A int desplaCamiento= c'ar Arra89ma3Arra8:; AKaK,KeK,KiK,KoK,KuKB= for(desplaCamiento;)=desplaCamientoDma3Arra8= desplaCamiento44) stdJJcoutDDArra89desplaCamiento:= stdJJcoutDDGHnG= Arra8#a8uscula(Arra8)= for(desplaCamiento;)=desplaCamientoDma3Arra8= desplaCamiento44) stdJJcoutDDArra89desplaCamiento:= return )= B void Arra8#a8uscula(c'ar Arra89ma3Arra8:) A for(int desplaCamiento;)=desplaCamientoDma3Arra8= desplaCamiento44) Arra89desplaCamiento:;toupper(Arra89desplaCamiento:)= 66Aqui return arra8 seria incorrecto B %a salida del programa demuestra que el arreglo se pasa en llamada por referenia* "a que el primer ilo for da omo salida los ontenidos de min#sulas originales' aeiou* mientras que el segundo ilo for en main() da omo salida los ontenidos del arreglo despu:s del llamado a la funi!n Arra8#a8uscula()J AIO>$ Claramente* dentro del uerpo de la funi!n Arra8#a8uscula()* +a ambiado el arreglo de regreso en la funi!n main()$ el siguiente ejemplo es una simple modifiai!n de este algoritmo* s!lo que en ve4 de pasar el arreglo ompleto* se pasa ada elemento individual' 65 66 ereArra8*.3code 56 ?include DiostreamE ?include Dct8pe.'E ?define ma3Arra8 + void lementosArra8#a8uscula(c'ar un"'ar)= int main (int argc, c'ar 5 const argv9:) A int desplaCamiento= c'ar Arra89ma3Arra8:; AKaK,KeK,KiK,KoK,KuKB= for(desplaCamiento;)=desplaCamientoDma3Arra8=desplaCamiento44) stdJJcoutDDArra89desplaCamiento:= stdJJcoutDDGHnG= for(desplaCamiento;)=desplaCamientoDma3Arra8=desplaCamiento44) lementosArra8#a8uscula(Arra89desplaCamiento:)= for(desplaCamiento;)=desplaCamientoDma3Arra8=desplaCamiento44) stdJJcoutDDArra89desplaCamiento:= return )= B void lementosArra8#a8uscula(c'ar un"'ar) A un"'ar;toupper(un"'ar)= B %a salida del programa es' aeiou aeiou valarra8 'as e3ited Lit' status ). Apuntadores Definicin 2 Un apuntador es una variable que contiene una direccin de memoria. Supongamos una variable de tipo entero que se llama contenido$A# " otra variable que se llama direccion$A# que puede ontener una variable de tipo entero$ En "6"44 una variable preedida del operador > devuelve la direi!n de la variable en lugar de su ontenido$ As6 que para asignar la direi!n de una variable a otra variable del tipo que ontiene direiones se usan sentenias omo esta' direccion$am ; <contenido$A# Figura 2: contenido$A# se asigna a la loalidad de memoria on direi!n ??<; En la figura 1 se ilustra el nombre de la variable contenido$A# " se observa que se enuentra en la direi!n ??<; de la memoria$ El ontenido de esta loalidad no se muestra$ Una variable que ontiene una direi!n* tal omo direccion$A#* se llama variable apuntador o simplemente apuntador$ Despues que la sentenia anterior se ejeuta* la direi!n de contenido$A# ser& asignada a la variable apuntador direccion$A#$ %a relai!n se e7presa diiendo que direccion$A# apunta a contenido$A#$ %a figura / ilustra esta relai!n$ Figura 3: 5otai!n de fle+a para los apuntadores El aeso al ontenido de una elda u"a direi!n est& almaenada en la variable direccion$A# es tan senillo omo poner al iniio de la variable apuntador un asteriso' 5direccion$A#$ %o que se +a +e+o es eliminar la referenia direta$ Por ejemplo* si se ejeutan las siguientes dos sentenias* el valor de la elda llamada contenido$A# ser& de 10 (v:ase la figura =)$ direccion$A# ; <contenido$A#= 5direccion$A# ; *)= Figura : A contenido$A# se le asigna el valor entero 10 Declaraciones de variables apuntador "6"44 requiere una definii!n para ada variable$ Para definir una variable apuntador direccion$A# que pueda ontener la direi!n de una variable int* se esribe' int 5direccion$A#= @ealmente e7isten dos partes separadas en esta delarai!n$ El tipo de dato de direccion$A# es' int 5 " el identifiador para la variable es direccion$A# El asteriso que sigue a int signifia AAapuntador aBB$ Esto es* el siguiente tipo de dato es una variable apuntador que puede ontener una direi!n a un int' int 5 En "6"44 una variable apuntador ontiene la direi!n de un tipo de dato partiular' c'ar 5direccion7c'ar= c'ar 5direccion7int= El tipo de dato de direccion7c'ar es diferente del tipo de dato de la variable apuntador direccion7int$ En un programa que define un apuntador a un tipo de dato " utli4a :ste para apuntar a otro tipo de dato* pueden ourrir errores en tiempo de ejeui!n " advertenias en tiempo de ompilai!n$ Una pr&tia de programai!n pobre ser6a definir un apuntador de una forma " luego utili4ar :ste de alguna otra forma$ Por ejemplo' int 5direccion7int= float un7float ; 2(.01= direccion7int ; <un7float= Utilizacin de punteros en sentencias sencillas 3eamos el siguiente ejemplo' 65 66 c'angeMals.3code 56 ()-) ?include DiostreamE ()*) ()0) int main (int argc, c'ar 5 const argv9:) A ()1) int A7int;-+, N7int;0., Temp7int= ()+) int 5direccion7int= ()/) ().) stdJJcoutDDGl contenido de A7int esJGDDA7intDDGHnG= ()() stdJJcoutDDGl contenido de N7int esJGDDN7intDDGHnG= ()2) direccion7int ; <A7int= (-)) Temp7int ; 5direccion7int= (--) 5direccion7int ; N7int= (-*) N7int ; Temp7int= (-0) stdJJcoutDDGDespues del intercambioJGDDGHnHnG= (-1) (-+) stdJJcoutDDGl contenido de A7int esJGDDA7intDDGHnG= (-/) stdJJcoutDDGl contenido de N7int esJGDDN7intDDGHnG= (-.) return )= (-() B En la l6nea (0=) se +an delarado tres variables de tipo entero* se da a ada elda un nombre " se iniiali4an 1 de :stas$ Supondremos que la direi!n de memoria asignada para la variable A7int es la direi!n +0*(* " la direi!n en memoria @AC asignada para la variable N7int es la direi!n .2-/* " la elda llamada Temp7int se le +a asignado la direi!n *0(+$ 3:ase la figura <. Figura !: Desripi!n de las tres variables en la memoria En la l6nea (0<) se define un apuntador a un tipo de dato entero llamado direccion7int$ %a sentenia asigna la elda " da a :sta un nombre$ %uego* en la l6nea (0D)* la terera sentenia asigna a direccion7int la direi!n de A7int (figura E)$ Figura ": direccion7int dada la direi!n de A7int %a l6nea (;0) utili4a la e7presi!n 5direccion7int para aeder al ontenido de la elda a la ual apunta direccion7int' Temp7int ; 5direccion7int= Por onsiguiente* el valor entero ;< se almaena en la variable Temp7int$ Si no se pone el 5 enfrente de direccion7int=* la sentenia de asignai!n almaenar6a ilegalmente el ontenido de direccion7int en la elda nombrada Temp7int* pero se supone que Temp7int ontiene un entero* no una direi!n$ Este puede ser un error mu" dif6il de loali4ar puesto que mu+os ompiladores no emiten ninguna adverteniaFerror$ Para empeorar el asunto* la ma"or6a de los apuntadores son eranos* lo que signifia que oupan 1 b"tes (= b"tes para apliaiones de /19bits)* el mismo tama8o que un entero en una PC$ %a sentenia (;;) opia el ontenido de la variable N7int en la elda apuntada por la direi!n almaenada en direccion7int(figura ?)' 5direccion7int ; N7int= Figura #: Se opia el ontenido de N7int usando la notai!n de fle+a de apuntadores %a #ltima sentenia en la l6nea (;1) simplemente opia el ontenido de una variable entera* Temp7int en otra variable entera N7int (figura G Figura $: Se opia Temp7int en N7int utili4ando asignai!n normal$ Debemos de asegurarnos de omprender la diferenia entre qu: se referenia uando una variable puntero est& preedida por el operador de indirei!n " u&ndo no est& preedida por este operador$ Para este ejemplo* la primera sinta7is es un apuntador a una elda que puede ontener un valor entero$ %a segunda sinta7is referenia la elda que ontiene la direi!n de otra elda que puede ontener un entero$ Utilizacin incorrecta del operador de direccin 5o se puede utili4ar el operador de direi!n sobre toda e7presi!n "6"44 $ El siguiente ejemplo demuestra aquellas situaiones donde no se puede apliar el operador de direi!n >$ puedeAlmacenarDireccionDe"onstante ; <0.= int $A#7int ; += puedeAlmacenarDireccionDe3presionTemp ; <($A#7int 4-+)= puedeAlmacenarDireccionDe$egistro ; <var$egistro= %a primera sentenia trata de obtener ilegalmente la direi!n de un valor onstante integrado$ %a sentenia no tiene sentido puesto que /? no tiene una elda de memoria asoiada on :ste$ %a segunda sentenia de asignai!n intenta devolver la direi!n de la e7presi!n $A#7int4-+$ 5o e7iste direi!n asoiada on la e7presi!n puesto que la e7presi!n en s6 misma es realmente un proeso de manipulai!n de pila$ 5ormalmente* el #ltimo ejemplo respeta la demanda del programador para definir var$egistro omo un registro m&s que omo una elda de almaenamiento en la memoria interna$ Por onsiguiente* no podr6a devolverse " almaenarse la direi!n de elda de memoria$ El ompilador "6"44 da la memoria de variable* no el almaenamiento de registro$ Estructuras C/C++ Definicin 3 Una estructura es un grupo de variables las cuales pueden ser de diferentes tipos sostenidas o mantenidas juntas en una sola unidad. La unidad es la estructura. Sintais ! reglas para estructuras en C/C++ En "6"44 se forma una estrutura utili4ando la palabra reservada struct* seguida por un ampo etiqueta opional* " luego una lista de miembros dentro de la estrutura$ %a etiqueta opional se utili4a para rear otras variables del tipo partiular de la estrutura' struct campo7etiquetaA tipo7miembro miembro7-= tipo7miembro miembro7*= tipo7miembro miembro70= J J tipo7miembro miembro7n= B= Un punto " oma finali4a la definii!n de una estrutura puesto que :sta es realmente una sentenia "6"44 $ Algunos de los ejemplos usan la estrutura' struct stbarcoA c'ar sCtipo9i!tring-+4i%ull7c'ar:= c'ar sCmodelo9i!tring-+4i%ull7c'ar:= c'ar sCtitular9i!tring*)4i%ull7c'ar:= int ianio= long int l'oras7motor= float fprecioventa= B= En un programa* podemos asoiar una variable on una estrutura utili4ando una sentenia similar a la siguiente' struct stbarco stbarco7usado= %a sentenia define stbarco7usado de tipo struct stbarco$ %a delarai!n requiere el uso del ampo etiqueta de la estrutura$ Si esta sentenia est& ontenida dentro de una funi!n* entones la estrutura* llamada stbarco7usado* tiene un &mbito loal a esa funi!n$ Si la sentenia est& ontenida fuera de todas las funiones de programa* la estrutura tendr& un &mbito global$ Es posible delarar una variable usando esta sinta7is' struct stbarcoA c'ar sCtipo9i!tring-+4i%ull7c'ar:= c'ar sCmodelo9i!tring-+4i%ull7c'ar:= c'ar sCtitular9i!tring*)4i%ull7c'ar:= int ianio= long int l'oras7motor= float fprecioventa= B stbarco7usado= Aqu6 la delarai!n de variable va antes del punto " oma final$ Cuando se asoia s!lo una variable on el tipo estrutura* el ampo etiqueta puede ser eliminado* por lo que ser6a posible esribir' struct A c'ar sCtipo9i!tring-+4i%ull7c'ar:= c'ar sCmodelo9i!tring-+4i%ull7c'ar:= c'ar sCtitular9i!tring*)4i%ull7c'ar:= int ianio= long int l'oras7motor= float fprecioventa= B stbarco7usado= Utilizacin de miembros de estructuras Para aesar a los miembros de las estruturas se usa el punto u operador miembro ($)$ %a sinta7is es' estructura%ombre.miembro%ombre Por ejemplo en' gets(stbarco7usado.sCmodelo)= Aqu6* stbarco7usado es el nombre asoiado on la estrutura* " sCmodelo es una variable miembro de la estrutura* otro ejemplo' stdJJcinEE stbarco7usado.sCtipo= Esta sentenia leer& la mara del stbarco7usado en el arreglo de arateres* mientras la pr!7ima sentenia imprimir& el preio de venta de stbarco7usado en la pantalla$ srdJJcoutDD stbarco7usado.fprecioventa= Ejemplo de estruturas' 65 fraction!truct.cpp , Programa para demostrar el uso de los tipos !truct en "44, este tipo de datos es util para los programadores para crear sus propias estructuras de tipos. 56 ?include DiostreamE using namespace std= 66 Definimos un nuevo tipo de estructura llamada Iraction 66 como la definicion se puso antes del GmainG 66 los tipos Iraction se pueden usar como prototipos struct Iraction A 66 declaramos sus dos miembros int numerator= int denominator= B= 66 %ote el punto 8 coma al final 66 funciones prototipos void getIraction(Iraction <f)= void printIraction(const Iraction <f)= int main (int argc, c'ar 5 const argv9:) A 66 declaramos variables de tipo Iraction Iraction f-, f*= 66 obtenemos dos fracciones 8 las desplegamos getIraction(f-)= cout DD GHnf- ; G= printIraction(f-)= getIraction(f*)= cout DD GHnf* ; G= printIraction(f*)= cout DD endl= return )= B 66 pedimos al usuario los valores del denominador 8 numerador 66 los almacenamos en su adecuado lugar en la estrcututra= c'ecamos si 66 el valor del denominador es valido 8 lo ponemos en - si no lo es. void getIraction(Iraction <f) A cout DD GHnnter t'e numeratorJ G= cin EE f.numerator= cout DD Gnter t'e denominatorJ G= cin EE f.denominator= if (f.denominator ;; )) A cout DD GHnIllegal denominatorO Denominator is being set to -.HnG= f.denominator ; -= B B 66 imprimimos la fraccion void printIraction(const Iraction <f) A cout DD f.numerator DD G6G DD f.denominator DD GHnG= B 5ota sobre las funiones prototipos' %as funiones prototipo tienen los siguientes usos importantes' Estableen el tipo devuelto para las funiones que devuelven otros tipos diferentes que int$ Aunque las funiones que devuelven valores enteris no neesitan prototipos* se reomienda tener prototipos$ Sin prototipos ompletos* se +aen las onversiones est&ndares* pero no se +ean los tipos o los n#meros de argumentos on el n#mero de par&metros$ %os prototipos se usan para iniiali4ar apuntadores a funiones* antes de que las funiones sean definidas$ %a lista de par&metros se usa para +ear la orrespondenia de los argumentos en la llamada a la funi!n on los par&metros en la definii!n de la funi!n const en par%metros de funciones El espeifiador const puede ser utili4ado en la definii!n de par&metros de funiones$ Esto resulta de espeial utilidad en tres asos$ En los tres el fin que se persigue es el mismo' indicar que la funcin no podr cambiar dichos argumentos' Con par&metros de funiones que sean de tipo matri4 (que se pasan por referenia)$ Ejemplo' int strlen(const c'ar9:)= Cuando los par&metros son punteros (a fin de que desde dentro de la funi!n no puedan ser modifiados los objetos refereniados)$ Ejemplo' int printf (const c'ar 5format, ...)= Cuando el argumento de la funi!n sea una referenia* previniendo as6 que la funi!n pueda modifiar el valor refereniado$ Ejemplo' int dimen(const @ <3*)=