Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: J_F_NASH en 09 de Octubre de 2003, 01:11:32 PM

Título: Enorme Follón: Punteros
Publicado por: J_F_NASH en 09 de Octubre de 2003, 01:11:32 PM
 #include <iostream.h>
#include <conio.h>

void main(int Num, char *cadena[])
{
int x = 0x01ff;

cout << "x(dec):" << x << hex << " x(hex):" << x << dec << endl;
getch();

int *p = &x;
cout << "Puntero int:" << *p << " Direccion de x:" << &x << endl;
getch();
cout << "Puntero esta en la direccion:" << &p << endl;
getch();

//Los resultados de lo que viene a continuacion no me caben en la cabeza:
unsigned char *p1 = (unsigned char *)&x; // entiendo que p y p1 apuntan a lo que hay en &x, osea: 511
cout << "byte 1:" << (int)*(p1+0) << endl; // p1 es multiplicado por ¿int? ¿que número?
getch();
cout << "byte 2:" << (int)*(p1+1) << endl;
getch();
cout << "byte 3:" << (int)*(p1+2) << endl;
getch();
cout << "byte 4:" << (int)*(p1+3) << endl;
getch();

//modicicamos solo el 2 byte
*(p1+1)=0;
cout << "\nNuevo valor x(dec):" << x << hex << " x(hex): " << x << dec << endl;
getch();
cout << "\nImprime direcciones de c/u:" << endl;
getch();
for (int i=0; i<4;i++)
 cout << "\nDireccion de " << i << "es " << hex << (long) (p1+i) << dec << endl;
getch();

}





S2.
Título: Enorme Follón: Punteros
Publicado por: HgH en 09 de Octubre de 2003, 01:40:31 PM
 
Citar
//Los resultados de lo que viene a continuacion no me caben en la cabeza:
unsigned char *p1 = (unsigned char *)&x; // entiendo que p y p1 apuntan a lo que hay en &x, osea: 511
cout << "byte 1:" << (int)*(p1+0) << endl; // p1 es multiplicado por ¿int? ¿que número?

No, no es una multiplicación. Eso quiere decir algo como "el byte apuntado por (p1+0) y convertido a int".
Si te es mas claro, sería algo como

unsigned char ValorByte      = *(p1+0);
int                  ValorEntero  = (int)ValorByte;
cout <<"byte 1:"<<ValorEntero<<endl;


Saludillos

Título: Enorme Follón: Punteros
Publicado por: _Grey en 10 de Octubre de 2003, 07:14:15 PM
 
Citarunsigned char *p1 = (unsigned char *)&x; // entiendo que p y p1 apuntan a lo que hay en &x, osea: 511

p1 es un puntero unsigned char unsigned char es de 1Byte, es decir que cuando leas el valor que apunta, leeras 255, que es lo que hay en el Byte que apunta &x, la variable x es de 4Bytes (en compiladores antiguos de 2Bytes), el primer Byte contiene 255 (0xff), el segundo 1(0x1) y los otros 2 Bytes estan a 0.

Citarcout << "byte 1:" << (int)*(p1+0) << endl;

HgH, entiende que coge el puntero como un puntero de int, yo creo que es un error de sintaxis, y se deberia escrivir (int*), pero teniendo en cuenta que quieres leer el contenido de un Byte podrias dejar solo el *, en realidad compilado se multiplica ..... pero por un tipo y no un valor..... por eso creo que es error de sintaxis, pon (int*) o si quieres leer solo 1 Byte deja solo el *.

Saludotes.