[C con Clase] Ayuda con Diferentes Dudas

Steven Davidson steven en conclase.net
Vie Ene 26 06:35:53 CET 2007


Hola David,

El pasado 2007-01-26 00:24:31, David Reza escribió:

DR> Bueno, mi primera duda es en cuanto a los punteros.
DR> En el capítulo de Punteros 1, no entiendo muy bien. Aquí están las dudas:
DR> Cada byte tiene una dirección de memoria? Siempre?

Sí. Supongo que puede haber un sistema que se base en unidades básicas de memoria mayores que 1 byte. Sin embargo, muchos programas usan esta idea básica de 1 byte por cada dirección de memoria. Claro que esto realmente depende de la arquitectura del procesador al igual que su conjunto de instrucciones. Por ejemplo, si la arquitectura usa direcciones de 32 bits, el PC (Contador de Programa) será incrementado, a nivel de hardware, 4 bytes, para que el PC "apunte" a la siguiente instrucción en el programa.

DR> Si la unidad básica es la palabra, y mi plataforma es de 32 bits significa
DR> que una palabra es igual a 4 bytes?
DR> Dice que lo que sucederá cuando las palabras sean de 32 bits, accederemos a
DR> posiciones de memoria de 4 bytes. Osea que lo de que cada byte tiene una
DR> dirección de memoria no se cumpliría y se cumpliría el hecho de que cada 4
DR> bytes contienen una dirección de memoria?
DR> A que se refiere con que una palabra siempre medirá 4 bytes?
DR> Si yo escribo una letra, 3,000 veces, sería una "palabra" y no creo que mida
DR> 4 bytes.

Espera. Creo que estás confundiendo el término de "palabra". A nivel de harware, hablamos de "palabras" (o words) para referirnos a la unidad básica o la cantidad de bytes con que el procesador "se sienta más cómodo".

Por regla general, también se habla de "word" o "palabra" como equivalente a 2 bytes. Te pongo una tabla breve de estos términos:

Nombre        Tamaño
--------------------------------
byte          1 byte = 8 bits
(octeto)

word          2 bytes
(palabra)

double word   2 words = 4 bytes
(long word)
(quad)     

quad word     4 words = 8 bytes

octaword      8 words = 16 bytes
(octoword)

Ten presente que esta tabla no representa una norma establecida. Por ejemplo, en sistemas Cray, un "word" equivale a 64 bits (8 bytes), porque  como ya dije representa la cantidad de memoria que el procesador maneja con más "comodidad".

En resumen, "palabra" o "word" no se refiere a las cadenas de caracteres que representan una palabra lingüísticamente hablando. Creo que con esta aclaración, tus dudas anteriores quedan despejadas, al menos que haya malinterpretado las inquietudes planteadas.

DR> Otra duda: En el mismo capítulo dice:
DR> Intentemos ver con mayor claridad el funcionamiento de los punteros. Podemos
DR> > considerar la memoria del ordenador como un gran array, de modo que podemos
DR> > acceder a cada celda de memoria a través de un índice. Podemos considerar
DR> > que la primera posición del array es la 0 celda[0].
DR> >
DR> > Si usamos una variable para almacenar el índice, por ejemplo, indice=0,
DR> > entonces celda[0] == celda[indice]. Prescindiendo de la notación de los
DR> > arrays, el índice se comporta exactamente igual que un puntero.
DR> >
DR> > grafico
DR> >
DR> > El puntero índice podría tener por ejemplo, el valor 3, en ese caso,
DR> > *indice tendría el valor 'valor3'.
DR> >
DR> Qué significa lo de 'gráfico'  y  *indice tendría el valor 'valor3' tal como
DR> dice la última línea o tendría el valor '3' ?

Me temo que "gráfico" se refería a una imagen que no salió bien. Ignora lo de "grafico".

DR> Otra duda:  Al definir un puntero, éste también tiene una dirección de
DR> memoria, aparte de la que almacena verdad?

Bueno. Aquí, tenemos que ser algo más explícitos con la terminología para que no haya malentendidos. Supongo que te refieres a una variable de tipo puntero. Entonces, la respuesta es "sí". La variable, como cualquier variable, ocupa memoria. Por lo tanto, tenemos la dirección de la memoria de la variable, la cual almacena direcciones de memoria.

DR> Otra: ¿Qué ventajas tiene utilizar memoria dinámica? ¿Para qué me sirve?

La memoria dinámica nos es muy útil para crear programas que necesiten más memoria de la que podemos dar inicialmente en nuestro diseño. Por ejemplo, si queremos mantener una lista de números enteros, podríamos optar por crear un array estático. El problema es que un array estático implica conocer de antemano la cantidad de elementos al igual que fijar la máxima cantidad. Esto es,

int lista[100];

Creamos una lista de 100 elementos; ni más ni menos. El programa no se puede adaptar si necesita más elementos en esta lista ni tampoco si se necesita menos de 100. La cantidad queda fijada en 100.

Usar memoria dinámicamente nos permitiría una manera de modificar la cantidad de elementos que necesitemos cuando la necesitemos. Por ejemplo,

int *pLista;
unsigned int nCantidad;

Una vez en ejecución, podemos determinar la cantidad exacta de elementos que necesitemos en nuestra lista. Para entronces, podemos ejecutar la siguiente sentencia:

pLista = new int[nCantidad];

Si hace falta cambiar la cantidad, entonces tendremos que hacer un poco más de gestión. Esto sería,

nCantidad = nNuevaCantidad;

int *pAux = new int[nCantidad];

Copiar( pAux, pLista, nCantidad );  // Copia los elementos de 'pLista' a 'pAux'

delete[] pLista;  // Borramos la lista antigua

pLista = pAux;  // Ahora 'pLista' apunta a la nueva lista de 'pAux'


Existen otros usos para la memoria dinámica, especialmente para las estructuras dinámicas de datos (EDD). Puedes consultar el curso de EDD yendo a nuestra página: http://c.conclase.net/edd/index.php


Espero haber aclarado las dudas.

Steven


Más información sobre la lista de distribución Cconclase