Programación en C (III Parte) <br />05/06/2011<br />Realizado por Mariela Curiel<br />Universidad Simón Bolívar<br />Junio...
Apuntadores<br />Manejo de memoria dinámica. Listas <br />Línea de comandos del main()<br />Entrada/Salida<br />Contenido<...
Funciones<br />Apuntadores<br />Manejo de memoria dinámica. Listas <br />Línea de comandos del Main<br />Entrada/Salida<br...
Los apuntadores en el Lenguaje C, son variables que poseen la dirección de la ubicación en memoria de otras variables.<br ...
int x; /* se crea en memoriauna variable entera  */<br />int *p; /* se declara un apuntadorquecontendrá la dirección de un...
Apuntadores<br />int c, ...;<br />int *p;<br />c = 63;<br />p = &c;<br />0<br />4<br />8<br />12<br />16<br />c:<br />63<b...
Apuntadores<br />int c, ...;<br />int *p;<br />c = 63;<br />0<br />4<br />8<br />12<br />16<br />c:<br />63<br />p:<br />2...
Apuntadores<br />int c,…;<br />int *p;<br />c = 63;<br />p = &c;<br />*p = 40;<br />0<br />4<br />8<br />12<br />16<br />c...
IMPORTANTE: Cuando se declara un apuntador no apunta a ningún lugar. Es necesario inicializarlo antes de usarlo. <br />int...
<ul><li>El símbolo & , se puedeaplicar a variables, funciones , etc , pero no a constantes o expresiones.
Para hallar el valor apuntado se utiliza el operador (*). Así, son equivalentes:</li></ul>y = x ; <br />y = *p; // tomando...
Incremento de apuntadores<br />int *dir;<br />....<br />dir + 1; /* Ok */<br />dir += 10; /* incrementadirparaapuntar 10 e...
<ul><li>Cuando se incrementa un apuntador se incrementa en un bloque de memoria (depende del tipo). Ejem:</li></ul>p++;<br...
Un apuntador a entero o float sumará 4 bytes a la dirección</li></ul>Apuntadores<br />
Comparación de apuntadores<br />Sólo se podrán comparar apuntadores del mismo tipo.<br />int t[10];<br />int *p;<br />for ...
Resta de apuntadores: la diferenciaproporciona el número de elementos del tipo en cuestión, situados entre las dos direcci...
Asignaciones y el apuntador NULL<br />int *p, *t, a[10];<br />p = a:<br />t = p;<br />p = NULL;<br />Operaciones sobre Apu...
Apuntadoresgenéricos<br />void ceros(void *dir, int n) {<br />inti;<br />  char *pch = dir;<br />  for(i=0;i < n; i++, pch...
Apuntadores y Arreglos<br />El nombre de un arreglo , para el compilador C , es un APUNTADOR inicializado con la dirección...
Recuperar un elemento de un arreglo usando apuntadores: <br />int *pa, a[10];<br /> pa = a; /* equivale a pa = &a[0]*/<br ...
Un arreglo como apuntador:<br />a[i] puede escribirse como *(a + i). i.e. &a[i] = a + i. <br />El apuntador lo podemos tra...
<ul><li>Sin embargo los apuntadores y arreglos son diferentes:</li></ul>inta[10], *pa;<br /><ul><li>Un apuntadoresuna vari...
Apuntadores y Arreglos<br />ASIGNACIONES ERRONEAS<br />intconjunto[3], lista[] = {5,6,7};<br />int *apuntador ;<br />apunt...
<ul><li>char *flecha;define un apuntador a un caracter.
char *car[5]; define un arreglo de 5 apuntadores a caracteres.
Los arreglos de apuntadorespuedeninicializarse de la misma forma que un arreglocomún:</li></ul> char *months = {``no month...
Los apuntadores pueden servir para el manejo de estructuras, y su alojamiento dinámico.<br /> Tienen además la propiedad d...
structconjunto {<br />int a ;<br />double b ;<br />char c[5] ;<br />} stconj ;<br />stconj.a = 10 ;<br />stconj.b = 1.15 ;...
Unaestructura, se puedepasar a unafuncióncomoargumento:<br />structconjunto {<br />int a ;<br />	double b ;<br />	char c[5...
Otra forma equivalenteesutilizar un apuntador a la estructura<br />structconjunto {<br />int a ;<br />    double b ;<br />...
Podemos declarar funciones que devuelven apuntadores a un tipo de datos:<br />char *funcion1(char * var1 ) ;<br />double *...
El retorno de las mismas puede inicializar apuntadores del mismo tipo al que se devuelve  o de un tipo distinto.<br />void...
Cuando  en el lenguaje C se pasan argumentos a las funciones, el pasaje de parámetros es por valor. <br />Los apuntadores ...
<ul><li>Es necesariopasarcomoparámetro la dirección de las variables paraqueéstaspuedan ser modificadaspor la función</li>...
Prototipo <br />void una_funcion( structconjunto *p);<br />…..<br />structconjunto {<br />int a ;<br />    double b ;<br /...
Apuntadores y Funciones<br />Cuando un arreglo se pasa a unafunción<br />comoparámetrolo querealmente se estápasandoeslaub...
strlen() esunafunción de la libreríaestándarqueretorna la longitud de un string:<br />intstrlen(char *s) { <br />     char...
<ul><li>Un arreglo de dos dimensionesesrealmente un arreglo de unadimensióndondecadaelementoes en símismo un arreglo. De a...
Los elementos del arreglo se almacenanporfilas.
Cuando se pasa un arreglo de dos dimensiones a unafunción, se pasa el número de columnas, -- el número de filasesirrelevan...
Considere la siguientematriz:<br />int a[5][35]<br />Para pasarlacomoargumento a unafunción, ésta se declaracomo:<br /> f(...
int (*a)[35]; declara un apuntador a un arreglo de 35 enteros. <br />int *a[35]; declara un arreglo de 35 apuntadores a en...
char *name[10]; <br />char Aname[10][20]; <br />Las instrucciones<br />name[3][4] y Aname[3][4] son correctas en C. <br />...
nametiene 10 elementosque son apuntadores no inicilizados.Laventajaesque los vectores de cadafilapueden ser de longitudes ...
Memoria Dinámica y estructuras de datos dinámicas<br />05/06/2011<br />
La Funcciónmallocse usaparaobtenerunaporcióncontigua de memoria. <br />void *malloc(size_tnumber_of_bytes) <br />Retorna u...
char *cp;<br />cp = malloc(100);<br />La instrucción anterior solicita al sistema operativo  100 bytes consecutivos y asig...
Es común usar  la función sizeof() para especificar el número de bytes de un determinado tipo o estructura de datos. <br /...
La función sizeof puede usarse para encontrar el tamaño de cualquier tipo de datos, variable o estructura. <br />int i;<br...
ip = (int *)malloc(100*sizeof(int));<br />Aquí haremos uso de la relación entre apuntadores y arreglos y trataremos la mem...
Cuando se termina de usar una porción de memoria se debe liberar usando la función  free(). <br />free() toma un apuntador...
Queremos almacenar 3 enteros, en una estructura de datos dinámica (lista). <br />Mostraremos cómo se hace de una forma sen...
Graficamente. <br />Paso 1<br />struct list{<br />int data;<br />struct list *next;<br />};<br />struct list a, b, c;<br /...
a<br />b<br />c<br />1<br />3<br />2<br />NULL<br />a.next = &b;<br />b.next = &c;<br />Paso 2<br />a.next -> data  es 2<b...
Ahora, cada elemento de la lista lo crearemos dinámicamente según se necesite. <br />Utilizaremos typedef, para crear tipo...
// Definición de tipos. Archivo list.h <br />#define NULL 0<br />typedef char DATA;<br />struct linked_list{<br />DATA d;<...
El programa de la siguiente lámina recibe como parámetro un arreglo de caracteres y los coloca en una lista. <br />Las var...
Upcoming SlideShare
Loading in...5
×

Programación en c (iii parte)

784

Published on

Fundamentos de Programación en C, última parte.

Published in: Education, Travel
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
784
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
34
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Programación en c (iii parte)

  1. 1. Programación en C (III Parte) <br />05/06/2011<br />Realizado por Mariela Curiel<br />Universidad Simón Bolívar<br />Junio, 2011<br />
  2. 2. Apuntadores<br />Manejo de memoria dinámica. Listas <br />Línea de comandos del main()<br />Entrada/Salida<br />Contenido<br />05/06/2011<br />2<br />
  3. 3. Funciones<br />Apuntadores<br />Manejo de memoria dinámica. Listas <br />Línea de comandos del Main<br />Entrada/Salida<br />Contenido<br />05/06/2011<br />3<br />
  4. 4. Los apuntadores en el Lenguaje C, son variables que poseen la dirección de la ubicación en memoria de otras variables.<br />Declaración de un apuntador:<br />tipo de variable apuntada *nombre_apunt;<br />int *pint ;<br />double *pfloat ;<br />char *letra , *codigo , *caracter ;<br />Apuntadores<br />
  5. 5. int x; /* se crea en memoriauna variable entera */<br />int *p; /* se declara un apuntadorquecontendrá la dirección de una variable entera */<br />p = &x; /* al apuntador se le asigna la dirección de la variable entera (x) */<br />Apuntadores<br />
  6. 6. Apuntadores<br />int c, ...;<br />int *p;<br />c = 63;<br />p = &c;<br />0<br />4<br />8<br />12<br />16<br />c:<br />63<br />p:<br />20<br />24<br />28<br />4<br />
  7. 7. Apuntadores<br />int c, ...;<br />int *p;<br />c = 63;<br />0<br />4<br />8<br />12<br />16<br />c:<br />63<br />p:<br />20<br />24<br />28<br />
  8. 8. Apuntadores<br />int c,…;<br />int *p;<br />c = 63;<br />p = &c;<br />*p = 40;<br />0<br />4<br />8<br />12<br />16<br />c:<br />40<br />p:<br />20<br />24<br />28<br />4<br />
  9. 9. IMPORTANTE: Cuando se declara un apuntador no apunta a ningún lugar. Es necesario inicializarlo antes de usarlo. <br />int *p;<br /> *p = 100; /* error */<br />El uso correcto es:<br />int *p, x;<br /> p = &x; // se inicializa el apuntador<br /> *p = 100; // se está dando un valor a lo apuntado por p.<br />Apuntadores<br />
  10. 10. <ul><li>El símbolo & , se puedeaplicar a variables, funciones , etc , pero no a constantes o expresiones.
  11. 11. Para hallar el valor apuntado se utiliza el operador (*). Así, son equivalentes:</li></ul>y = x ; <br />y = *p; // tomando en cuenta la asignación de la lámina anterior.<br />printf("%d" , x ) ;<br />printf("%d" , *p) ;<br />Apuntadores<br />
  12. 12. Incremento de apuntadores<br />int *dir;<br />....<br />dir + 1; /* Ok */<br />dir += 10; /* incrementadirparaapuntar 10 elementos. masadelante */<br />Operaciones sobre Apuntadores<br />
  13. 13. <ul><li>Cuando se incrementa un apuntador se incrementa en un bloque de memoria (depende del tipo). Ejem:</li></ul>p++;<br /><ul><li>Un apuntador a caráctersumará un byte a la dirección.
  14. 14. Un apuntador a entero o float sumará 4 bytes a la dirección</li></ul>Apuntadores<br />
  15. 15. Comparación de apuntadores<br />Sólo se podrán comparar apuntadores del mismo tipo.<br />int t[10];<br />int *p;<br />for (p=t; p < t+10;p++)<br /> *p = 1;<br />Operaciones sobre Apuntadores<br />
  16. 16. Resta de apuntadores: la diferenciaproporciona el número de elementos del tipo en cuestión, situados entre las dos direcciones.<br />intstrlen(char *s){<br /> char *p=s;<br /> while (*p != ‘0’)<br /> p++;<br /> return p - s;<br /> }<br />Operaciones sobre Apuntadores<br />
  17. 17. Asignaciones y el apuntador NULL<br />int *p, *t, a[10];<br />p = a:<br />t = p;<br />p = NULL;<br />Operaciones sobre Apuntadores<br />
  18. 18. Apuntadoresgenéricos<br />void ceros(void *dir, int n) {<br />inti;<br /> char *pch = dir;<br /> for(i=0;i < n; i++, pch++) *pch = 0;<br />}<br />...<br />int t[0];<br />double z;<br />ceros(t, 10*sizeof(int));<br />ceros(&z, sizeof(z));<br />Operaciones sobre Apuntadores<br />
  19. 19. Apuntadores y Arreglos<br />El nombre de un arreglo , para el compilador C , es un APUNTADOR inicializado con la dirección del primer elemento del arreglo. <br />float var,conjunto[]={8.0,7.0,6.0,5.0);<br />float *pf;<br />pf = conjunto; /* equivale a hacer<br />pf = &conjunto[0]*/<br /> var1 = *pf;<br /> *pf = 25.1;<br />
  20. 20. Recuperar un elemento de un arreglo usando apuntadores: <br />int *pa, a[10];<br /> pa = a; /* equivale a pa = &a[0]*/<br />también ....<br />x = *(pa + i) equivale a x = a[i] <br />Apuntadores y Arreglos<br />
  21. 21. Un arreglo como apuntador:<br />a[i] puede escribirse como *(a + i). i.e. &a[i] = a + i. <br />El apuntador lo podemos tratar como arreglo: <br />pa[i] en lugar de *(pa + i). <br />Apuntadores y Arreglos<br />
  22. 22. <ul><li>Sin embargo los apuntadores y arreglos son diferentes:</li></ul>inta[10], *pa;<br /><ul><li>Un apuntadoresuna variable. Nosotrospodemoshacer: </li></ul>pa = a y pa++<br /><ul><li>Un arreglo no esuna variable. Las instrucciones</li></ul>a = pa y a++ SON ILEGALES.<br />Apuntadores y Arreglos<br />
  23. 23. Apuntadores y Arreglos<br />ASIGNACIONES ERRONEAS<br />intconjunto[3], lista[] = {5,6,7};<br />int *apuntador ;<br />apuntador = lista ; /* correcto */<br />conjunto = apuntador; /* ERROR */<br />lista = conjunto ; /* ERROR */<br />apuntador = &conjunto /* ERROR no se puedeaplicar el operador “&” aunaconstante */<br />
  24. 24. <ul><li>char *flecha;define un apuntador a un caracter.
  25. 25. char *car[5]; define un arreglo de 5 apuntadores a caracteres.
  26. 26. Los arreglos de apuntadorespuedeninicializarse de la misma forma que un arreglocomún:</li></ul> char *months = {``no month'', ``jan'', ``feb”, ...};<br />Arreglos de Apuntadores<br />
  27. 27. Los apuntadores pueden servir para el manejo de estructuras, y su alojamiento dinámico.<br /> Tienen además la propiedad de poder direccionar a los miembros de las mismas utilizando el operador (->) .<br />Apuntadores a Estructuras<br />
  28. 28. structconjunto {<br />int a ;<br />double b ;<br />char c[5] ;<br />} stconj ;<br />stconj.a = 10 ;<br />stconj.b = 1.15 ;<br />stconj.c[0] = 'A' ;<br />Con apuntadores: <br />structconjunto *pconj ;<br />pconj = (structconjunto *)malloc( sizeof( structconjunto )) ;<br />pconj->a = 10 ;<br />pconj->b = 1.15 ;<br />pconj->c[0] = 'A' ;<br />
  29. 29. Unaestructura, se puedepasar a unafuncióncomoargumento:<br />structconjunto {<br />int a ;<br /> double b ;<br /> char c[5] ;<br /> } datos; //declaración de la variable datos<br />void funcion( structconjunto); //prototipo<br />. . .<br />funcion(datos); // llamada<br />APUNTADORES COMO PARAMETROS DE FUNCIONES<br />
  30. 30. Otra forma equivalenteesutilizar un apuntador a la estructura<br />structconjunto {<br />int a ;<br /> double b ;<br /> char c[5] ;<br />} a; // declaración de la variable “a”<br />void una_funcion( structconjunto*); //prototipo<br />una_funcion(&a); //llamada<br />APUNTADORES COMO PARAMETROS DE FUNCIONES<br />
  31. 31. Podemos declarar funciones que devuelven apuntadores a un tipo de datos:<br />char *funcion1(char * var1 ) ;<br />double *funcion2(int i, double j, char *k ) ;<br />struct item *funcion3( struct stock *puntst ) ;<br />APUNTADORES COMO RESULTADO DE UNA FUNCION<br />
  32. 32. El retorno de las mismas puede inicializar apuntadores del mismo tipo al que se devuelve o de un tipo distinto.<br />void *malloc(int tamaño) ;<br /> p = (double *)malloc( 64 ) ;<br />APUNTADORES COMO RESULTADO DE UNA FUNCION<br />
  33. 33. Cuando en el lenguaje C se pasan argumentos a las funciones, el pasaje de parámetros es por valor. <br />Los apuntadores se utilizan para realizar el pasaje de parámetros por referencia.<br />int a,b;<br />swap(a, b) /* NO FUNCIONA */. <br />Apuntadores y Funciones<br />
  34. 34. <ul><li>Es necesariopasarcomoparámetro la dirección de las variables paraqueéstaspuedan ser modificadaspor la función</li></ul> swap(&a, &b) /* Llamada */<br /> . . .<br /> void swap(int *px, int *py){ <br />int temp;<br /> temp = *px /* lo apuntadopor p*/ <br /> *px = *py;<br /> *py = temp;<br /> }<br />Apuntadores y Funciones<br />
  35. 35. Prototipo <br />void una_funcion( structconjunto *p);<br />…..<br />structconjunto {<br />int a ;<br /> double b ;<br /> char c[5] ;<br />} a;<br />una_funcion(&a);<br />Declaración de la variable a<br />Llamada con la dirección de <br />la variable<br />APUNTADORES COMO PARAMETROS DE FUNCIONES<br />
  36. 36. Apuntadores y Funciones<br />Cuando un arreglo se pasa a unafunción<br />comoparámetrolo querealmente se estápasandoeslaubicación en memoria de su primer elemento:<br />strlen(s) equivalestrlen(&s[0]) <br />La declaración de la funciónes: <br />intstrlen(char s[]) ;<br />Y unadeclaraciónequivalentees : <br />intstrlen(char *s); porque char s[] es similar a char *s.<br />llamada<br />
  37. 37. strlen() esunafunción de la libreríaestándarqueretorna la longitud de un string:<br />intstrlen(char *s) { <br /> char *p = s;<br /> while (*p != `0’);<br /> p++;<br /> return p-s;<br />}<br />llamada: <br />char nombre[10];<br />strlen(nombre);<br />Apuntadores y Funciones<br />
  38. 38. <ul><li>Un arreglo de dos dimensionesesrealmente un arreglo de unadimensióndondecadaelementoes en símismo un arreglo. De ahí la notación:a[n][m].
  39. 39. Los elementos del arreglo se almacenanporfilas.
  40. 40. Cuando se pasa un arreglo de dos dimensiones a unafunción, se pasa el número de columnas, -- el número de filasesirrelevante. </li></ul>Arreglos Multidimensionales y Apuntadores<br />
  41. 41. Considere la siguientematriz:<br />int a[5][35]<br />Para pasarlacomoargumento a unafunción, ésta se declaracomo:<br /> f(int a[5][35]) {.....}<br />f(int a[][35]) {.....} <br />o incluso: <br />f(int (*a)[35]) {.....}<br />Arreglos Multidimensionales y Apuntadores<br />
  42. 42. int (*a)[35]; declara un apuntador a un arreglo de 35 enteros. <br />int *a[35]; declara un arreglo de 35 apuntadores a enteros. <br />Arreglos Multidimensionales y Apuntadores<br />
  43. 43. char *name[10]; <br />char Aname[10][20]; <br />Las instrucciones<br />name[3][4] y Aname[3][4] son correctas en C. <br />Sin embargo<br /><ul><li>Anameis un arreglo de 2D de 200 elementos.
  44. 44. nametiene 10 elementosque son apuntadores no inicilizados.Laventajaesque los vectores de cadafilapueden ser de longitudes diferentes.</li></ul>ArreglosMultidimensionales y Apuntadores<br />
  45. 45. Memoria Dinámica y estructuras de datos dinámicas<br />05/06/2011<br />
  46. 46. La Funcciónmallocse usaparaobtenerunaporcióncontigua de memoria. <br />void *malloc(size_tnumber_of_bytes) <br />Retorna un apuntador del tipovoid *.Si la memoria no se puedeasignarretorna NULL<br />El tipo del argumento(size_t)estadefinido en stdlib.h y es un tipounsigned. <br />Memoria Dinámica<br />
  47. 47. char *cp;<br />cp = malloc(100);<br />La instrucción anterior solicita al sistema operativo 100 bytes consecutivos y asigna la dirección de comienzo de este bloque a al apuntador cp. <br />Memoria Dinámica<br />
  48. 48. Es común usar la función sizeof() para especificar el número de bytes de un determinado tipo o estructura de datos. <br />int *ip;<br />ip = (int *) malloc(100*sizeof(int));<br />Memoria Dinámica<br />
  49. 49. La función sizeof puede usarse para encontrar el tamaño de cualquier tipo de datos, variable o estructura. <br />int i;<br />struct COORD {float x,y,z};<br />typedef struct COORD PT;<br />sizeof(int), sizeof(i),<br />sizeof(struct COORD) y<br />sizeof(PT) son todos válidos<br />Memoria Dinámica<br />
  50. 50. ip = (int *)malloc(100*sizeof(int));<br />Aquí haremos uso de la relación entre apuntadores y arreglos y trataremos la memoria reservada como un arreglo.<br />En lugar de <br />*ip = 100, podemos hacer:<br />ip[0] = 100; <br />o<br />for(i=0;i<100;++i) printf("%d",ip[i]); <br />
  51. 51. Cuando se termina de usar una porción de memoria se debe liberar usando la función free(). <br />free() toma un apuntador como argumento y libera la memoria direccionada por el apuntador. <br />Memoria Dinámica<br />
  52. 52. Queremos almacenar 3 enteros, en una estructura de datos dinámica (lista). <br />Mostraremos cómo se hace de una forma sencilla:<br />1. Primero crearemos tres variables de un determinado tipo (struct list). Dichas variables contendrán el valor entero a almacenar y un apuntador inicializado en NULL.<br />2. Luego colocaremos el apuntador de una variable a “apuntar” a la siguiente. <br />Creación de Estructuras de datos dinámicas<br />05/06/2011<br />
  53. 53. Graficamente. <br />Paso 1<br />struct list{<br />int data;<br />struct list *next;<br />};<br />struct list a, b, c;<br />a.data = 1;<br />b.data = 2;<br />c.data = 3;<br />a.next = b.next = c.next = NULL;<br />1<br />NULL<br />a<br />b<br />NULL<br />2<br />3<br />c<br />NULL<br />Estructuras autoreferenciadas <br />
  54. 54. a<br />b<br />c<br />1<br />3<br />2<br />NULL<br />a.next = &b;<br />b.next = &c;<br />Paso 2<br />a.next -> data es 2<br />a.next -> next -> data es 3<br />Estructuras autoreferenciadas <br />
  55. 55. Ahora, cada elemento de la lista lo crearemos dinámicamente según se necesite. <br />Utilizaremos typedef, para crear tipos de datos que permiten una programación más ellegante.<br />Esta vez, cada elemento de la lista almacenará un carácter y el apuntador al próximo elemento de la lista. <br />Otro Ejemplo<br />05/06/2011<br />
  56. 56. // Definición de tipos. Archivo list.h <br />#define NULL 0<br />typedef char DATA;<br />struct linked_list{<br />DATA d;<br />struct linked_list *next;<br />};<br />typedef struct linked_list ELEMENT;<br />typedef ELEMENT *LINK;<br />Estructurasautoreferenciadas<br />
  57. 57. El programa de la siguiente lámina recibe como parámetro un arreglo de caracteres y los coloca en una lista. <br />Las variables head y tail apuntan en todo momento a la cabeza y cola de la lista respectivamente. Al comienzo apuntan a NULL.<br />Estructurasautoreferenciadas<br />05/06/2011<br />
  58. 58. #include “list.h”<br />LINK s_to_l (char s[]) {<br />LINK head = NULL, tail=NULL;<br />int i;<br />if (s[0] != ‘0’) {<br /> head = (LINK) malloc(sizeof(ELEMENT));<br />head -> d = s[0];<br />tail = head;<br />for (i = 1; s[i] != ‘0’, ++i) {<br /> tail ->next = (LINK) malloc(sizeof(ELEMENT));<br /> tail = tail->next;<br /> tail -> d = s[i];<br />}<br />tail ->next = NULL;<br />return(head);<br />} }<br />
  59. 59. A<br />head<br />?<br />tail<br />Se recibe como parámetro <br />El string “AB”<br />#include “list.h”<br />LINK s_to_l (char s[]) {<br />LINK head = NULL, tail=NULL;<br />int i;<br />if (s[0] != ‘0’) {<br /> head = (LINK) malloc(sizeof(ELEMENT));<br />head -> d = s[0];<br />tail = head;<br />for (i = 1; s[i] != ‘0’, ++i) {<br /> tail ->next = (LINK) malloc(sizeof(ELEMENT));<br /> tail = tail->next;<br /> tail -> d = s[i];<br />}<br />tail ->next = NULL;<br />return(head);<br />} }<br />
  60. 60. head<br />A<br />?<br />tail<br />head<br />A<br />?<br />B<br />tail<br />LINK head = NULL, tail=NULL;<br />inti;<br />if (s[0] != ‘0’) {<br /> head = (LINK) malloc(sizeof(ELEMENT));<br />head -> d = s[0];<br />tail = head;<br />for (i = 1; s[i] != ‘0’, ++i) {<br /> tail ->next = (LINK) malloc(sizeof(ELEMENT));<br /> tail = tail->next;<br /> tail -> d = s[i];<br />}<br />tail ->next = NULL;<br />return(head);<br />} }<br />
  61. 61. tail<br />head<br />A<br />NULL<br />B<br />LINK head = NULL, tail=NULL;<br />int i;<br />if (s[0] != ‘0’) {<br /> head = (LINK) malloc(sizeof(ELEMENT));<br />head -> d = s[0];<br />tail = head;<br />for (i = 1; s[i] != ‘0’, ++i) {<br /> tail ->next = (LINK) malloc(sizeof(ELEMENT));<br /> tail = tail->next;<br /> tail -> d = s[i];<br />}<br />tail ->next = NULL;<br />return(head);<br />} }<br />
  62. 62. Para poder tener acceso a los argumentos de la línea de comandos el main se debe definir de la siguiente forma: <br /> main(int argc, char **argv) <br /><ul><li>argc es el número total de argumentos incluyendo el nombre de programa.
  63. 63. argv es un arreglo de strings. Cada posición del arreglo contiene un argumento. </li></ul>Argumentos del Main<br />
  64. 64. Línea de Comandos<br />#include<stdio.h> <br />main (int argc, char **argv) { <br />/* programa que imprime los argumentos de la línea de comandos */ <br />int i; <br /> printf(``argc = %dn'',argc); <br /> for (i=0;i<argc;++i) <br /> printf(``argv[%d]:%sn'',i,argv[i]);<br />}<br />
  65. 65. Si se invoca el programa (argum) con los siguientesargumentos: <br />argum f1 “f2” f3 4 stop! <br />La salidaserá:<br />argc = 6<br />argv[0] = argum<br />argv[1] = f1<br />argv[2] = f2<br />argv[3] = f3<br />argv[4] = 4<br />argv[5] = stop!<br />Los caracteres “” se ignoran. <br />Línea de Comandos<br />
  66. 66. Brian Kernighan y Dennis Ritchie. El Lenguaje de Programación C. Prentice Hall. <br />http://www.its.strath.ac.uk/cources/c<br />Bibliografía<br />05/06/2011<br />58<br />
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×