17.05.2013 Views

Tutorial de Apuntadores y Arreglos en C - Cimat

Tutorial de Apuntadores y Arreglos en C - Cimat

Tutorial de Apuntadores y Arreglos en C - Cimat

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

void mi_funcion_A(char *ptr)<br />

{<br />

char a[] = "ABCDE";<br />

}<br />

.<br />

.<br />

void mi_funcion_B(char *ptr)<br />

{<br />

char *cp = "FGHIJ";<br />

}<br />

.<br />

.<br />

En el caso <strong>de</strong> mi_funcion_A, el cont<strong>en</strong>ido, o valor(es), <strong>de</strong>l arreglo a[] son consi<strong>de</strong>rados como los datos. Se<br />

dice que el arreglo ha sido inicializado a los valores ABCDE. En el caso <strong>de</strong> mi_funcion_B, el valor <strong>de</strong>l<br />

apuntador cp se consi<strong>de</strong>ra como dato. El puntero ha sido inicializado para apuntar a la ca<strong>de</strong>na FGHIJ. En<br />

ambas funciones las <strong>de</strong>finiciones son variables locales y por tanto la ca<strong>de</strong>na ABCDE se guarda <strong>en</strong> la pila<br />

(stack), así como el valor <strong>de</strong>l apuntador cp. La ca<strong>de</strong>na FGHIJ se guarda <strong>en</strong> cualquier lugar que resulte<br />

a<strong>de</strong>cuado. En mi sistema se guarda <strong>en</strong> el segm<strong>en</strong>to <strong>de</strong> datos.<br />

Dicho sea <strong>de</strong> paso, la inicialización por arreglo <strong>de</strong> variables automáticas como se hizo <strong>en</strong> mi_funcion_A era<br />

ilegal <strong>en</strong> el viejo C <strong>de</strong> K&R y solo “vino a darse” <strong>en</strong> el nuevo ANSI C. Un factor que pue<strong>de</strong> ser importante<br />

cuando se esta consi<strong>de</strong>rando la portabilidad y la compatibilidad “hacia atrás”.<br />

A la vez que vamos discuti<strong>en</strong>do las relaciones/difer<strong>en</strong>cias <strong>en</strong>tre apuntadores y arreglos, veamos algo sobre<br />

arreglos multidim<strong>en</strong>sionales. Consi<strong>de</strong>remos por ejemplo el arreglo:<br />

char multi[5][10];<br />

¿Qué hay con eso? Bi<strong>en</strong>, veámoslo con otra perspectiva:<br />

char multi[5][10];<br />

Tomemos como el “nombre” <strong>de</strong>l arreglo la parte subrayada. Luego <strong>en</strong>tonces anteponiéndole char y<br />

posponi<strong>en</strong>do [10] t<strong>en</strong>emos <strong>en</strong>tonces un arreglo <strong>de</strong> 10 caracteres. Pero el nombre multi[5] es <strong>en</strong> si un arreglo<br />

indicando que consta <strong>de</strong> 5 elem<strong>en</strong>tos los cuales a su vez constan <strong>de</strong> 10 caracteres cada uno. Por tanto<br />

t<strong>en</strong>emos un arreglo <strong>de</strong> 5 arreglos <strong>de</strong> 10 caracteres cada uno.<br />

Asumamos que hemos rell<strong>en</strong>ado este arreglo bidim<strong>en</strong>sional. En memoria t<strong>en</strong>dríamos algo similar a que si el<br />

arreglo bidim<strong>en</strong>sional estuviera formado por 5 arreglos separados que hubiéramos inicializado con algo como:<br />

multi[0] = {'0','1','2','3','4','5','6','7','8','9'}<br />

multi[1] = {'a','b','c','d','e','f','g','h','i','j'}<br />

multi[2] = {'A','B','C','D','E','F','G','H','I','J'}<br />

multi[3] = {'9','8','7','6','5','4','3','2','1','0'}<br />

multi[4] = {'J','I','H','G','F','E','D','C','B','A'}<br />

24

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!