[C con Clase] Ayuda con Diferentes Dudas

Joaquin Fernandez joaquinfq en gmail.com
Sab Ene 27 07:32:02 CET 2007


>     Cada grupo de 8 bits forma un byte u octeto. En realidad el
>     microprocesador, y por lo tanto nuestro programa, sólo puede manejar
>     directamente bytes o grupos de dos o cuatro bytes. Para acceder a
>     los bits hay que acceder antes a los bytes. Y aquí llegamos al quid,
>     cada byte tiene una dirección, llamada normalmente dirección de memoria.

Todo microprocesador tiene instrucciones para manipular bits directamente. Si quieres poner a 1 o 0
determinado bit puedes hacer uso de esas instrucciones, sin necesidad de manipular los bytes
completamente. Lo que pasa es que todos los registros de direccionamiento que tienen los
procesadores son múltiplos de bytes, por eso no puede acceder a un bit específico, sino primero al
byte de la posición de memoria por medio de un registro de direccionamiento y luego al bit
correspondiente.

>     La unidad de información básica es la palabra, dependiendo del tipo
>     de microprocesador una palabra puede estar compuesta por dos,
>     cuatro, ocho o dieciséis bytes. Hablaremos en estos casos de

La unidad básica de información en computación ha sido, es y será el bit. Las agrupaciones llamadas
nibbles, bytes, palabras, etc., se han hecho por comodidad para agrupar cantidades que permiten
manejar mayores valores. Un nibble son 4 bits, un byte son 8 bits, una palabra SIEMPRE será de 16
bits conocida en assembler como WORD, luego viene la doble palabra o DWORD y es de 32 bits y así
sucesivamente.

>     plataformas de 16, 32, 64 ó 128 bits. Se habla indistintamente de
>     direcciones de memoria, aunque las palabras sean de distinta
>     longitud. Cada dirección de memoria contiene siempre un byte. Lo que
>     sucederá cuando las palabras sean de 32 bits es que accederemos a
>     posiciones de memoria que serán múltiplos de 4.

Esto siempre y cuando tu puntero sea a un dato de 32 bits. Un puntero char puede ser usado para leer
un valor de 32 bits, y será incrementado de uno en uno. Lo que debes tener presente cuando manejas
valores de 32 bits, es que al usar punteros, este debe ser incrementado de manera apropiada, según
el dato al que representa cuando se declaró, no de acuerdo al dato que recibirá el valor leído. Es
decir, un puntero a un valor de 32 bits se incrementara 4 bytes, pero uno de 16 se incrementará en 2
bytes, pero por eso no deja de poder usarse para leer un valor de 32 bits. Más bien expresaría lo
que dijiste así:

"Lo que sucederá cuando las palabras sean de 32 bits es que deberemos acceder a 4 posiciones de
memoria sucesivas para obtener el valor almacenado"

>     Si usamos una variable para almacenar el índice, por ejemplo,
>     indice=0, entonces celda[0] == celda[indice]. Prescindiendo de la
>     notación de los arrays, el índice se comporta exactamente igual que
>     un puntero.
> 
>     El puntero índice podría tener por ejemplo, el valor 3, en ese caso,
>     *indice tendría el valor 'valor3'.

Aquí confundes el valor "de" el puntero con el valor apuntador "por" el puntero. Te lo explico:

char c[5], *p = c, i = 0;

Aquí c[i] == p y p != i. Como verás, el valor del puntero p es diferente del valor del índice i. Sin
embargo, (p - c) == i porque todos apuntan al mismo tipo de datos. Bajo ninguna circunstancia
deberías hacer c[p] porque es muy probable que p != i y p seguramente tiene un valor mucho mayor que
el máximo del array y lo desbordaría. Ahora, sí se puede hacer

char c[5], i = 0, *p = &i;

Aquí tenemos c[*p] == c[i], porque *p devuelve el mismo valor que tiene i. Pero igual que el caso
anterior, p != i mientras que *p == i.

>     Las celdas de memoria existirán independientemente del valor de
>     indice, o incluso de la existencia de indice, por lo tanto, la
>     existencia del puntero no implica nada más que eso, pero no que el
>     valor de la dirección que contiene sea un valor válido de memoria.

Así es, un puntero puede tener un valor el cual no necesariamente es un valor válido. En este caso
obtienes un "segmentation fault" cuando tratas de modificar la memoria direccionada por el puntero.

> Disculpa si no puedo ser más explícito. Subrayé las partes que no
> entiendo, lo demás sólo lo pongo para conocimiento de lo que hablo.
> Me gustaría mucho que me pudieras seguir auxiliando Steven.

Bueno, no te escribo más porque quieres que sea Steven quien te explique :P

Saludos

Joaquín




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