Tutorial de Apuntadores y Arreglos en C - Cimat
Tutorial de Apuntadores y Arreglos en C - Cimat
Tutorial de Apuntadores y Arreglos en C - Cimat
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