13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

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.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 121 — #159<br />

✐<br />

3.8. Creación de tipos compuestos<br />

Primero, el programa garantiza que se le haya pasado un argum<strong>en</strong>to comprobando<br />

el valor de argc, que vale dos si hay un solo argum<strong>en</strong>to (es uno si no hay<br />

argum<strong>en</strong>tos, ya que el nombre del programa siempre es el primer elem<strong>en</strong>to de a-<br />

rgv). Si eso falla, imprime un m<strong>en</strong>saje e invoca la función exit() de la librería<br />

Estándar de C para finalizar el programa.<br />

El programa toma el argum<strong>en</strong>to de la línea de comandos y convierte los caracteres<br />

a double utilizando atof(). Luego el double se trata como un vector de bytes<br />

tomando la dirección y moldeándola a un unsigned char*. Para cada uno de estos<br />

bytes se llama a printBinary() para mostrarlos.<br />

Este ejemplo se ha creado para imprimir los bytes <strong>en</strong> un ord<strong>en</strong> tal que el bit de<br />

signo aparece al principio - <strong>en</strong> mi máquina. En otras máquinas puede ser difer<strong>en</strong>te,<br />

por lo que puede querer re-organizar el modo <strong>en</strong> que se imprim<strong>en</strong> los bytes. También<br />

debería t<strong>en</strong>er cuidado porque los formatos <strong>en</strong> punto-flotante no son tan triviales de<br />

<strong>en</strong>t<strong>en</strong>der; por ejemplo, el expon<strong>en</strong>te y la mantisa no se alinean g<strong>en</strong>eralm<strong>en</strong>te <strong>en</strong>tre<br />

los límites de los bytes, <strong>en</strong> su lugar un número de bits se reserva para cada uno y<br />

se empaquetan <strong>en</strong> la memoria tan apretados como se pueda. Para ver lo que esta<br />

pasando, necesitaría averiguar el tamaño de cada parte del número (los bit de signo<br />

siempre son de un bit, pero los expon<strong>en</strong>tes y las mantisas pued<strong>en</strong> ser de difer<strong>en</strong>tes<br />

tamaños) e imprimir separados los bits de cada parte.<br />

Aritmética de punteros<br />

Si todo lo que se pudiese hacer con un puntero que apunta a un vector fuese<br />

tratarlo como si fuera un alias para ese vector, los punteros a vectores no t<strong>en</strong>drían<br />

mucho interés. Sin embargo, los punteros son mucho más flexibles que eso, ya que se<br />

pued<strong>en</strong> modificar para apuntar a cualquier otro sitio (pero recuerde, el id<strong>en</strong>tificador<br />

del vector no se puede modificar para apuntar a cualquier otro sitio).<br />

La aritmética de punteros se refiere a la aplicación de alguno de los operadores<br />

aritméticos a los punteros. Las razón por la cual la aritmética de punteros es un tema<br />

separado de la aritmética ordinaria es que los punteros deb<strong>en</strong> ajustarse a cláusulas<br />

especiales de modo que se comport<strong>en</strong> apropiadam<strong>en</strong>te. Por ejemplo, un operador<br />

común para utilizar con punteros es ++, lo que "añade uno al puntero." Lo que de<br />

hecho significa esto es que el puntero se cambia para moverse al "sigui<strong>en</strong>te valor,"<br />

Lo que sea que ello signifique. A continuación, un ejemplo:<br />

//: C03:PointerIncrem<strong>en</strong>t.cpp<br />

#include <br />

using namespace std;<br />

int main() {<br />

int i[10];<br />

double d[10];<br />

int* ip = i;<br />

double* dp = d;<br />

cout

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

Saved successfully!

Ooh no, something went wrong!