Maestros de la indirección
Este problema lo diseñé hace unos años, cuando le daba clases a mi amiga Marta para preparar su examen final de programación en la universidad. En cuestiones de punteros en C++ soy de los que piensan que no hay medias tintas; o eres capaz de resolver este ejercicio en unos minutos (cuatro o cinco de media, aunque el tiempo no es importante), o no te has enterado de nada.
Esta vez no hay premio porque para obtener la solución sólo hay que compilarlo y ejecutarlo. Papel, lápiz y 300 segundos: ¿Cuál es la salida del programa?
PS: Marta por supuesto sacó un 10!
PS2: No hay punteros a funciones porque esta vez no entraban en el temario.
#include <iostream> int main() { void *x[2]; char *y=(char*)new void*[3]; void *z=y; *x=&z; *(void**)y=(((char*)x)+sizeof(void*)); y+=2*sizeof(void*); x[1]=(void*)y; *((void**)x[1])=(void**)z+1; *((char**)z+1)=new char[1<<4]; ((void**)z)[0x2]=((void**)z)+1; y=((char**)z)[1]; y[0]=y[1]=*(y+2)=*&y[3]=0140; y[3]+=&x[1]-x; y[2]+=(((void**)x[1])-(void**)z)*0x6; *(&(*(&(*(&(*y))))))+=8; *(&(*(&(*(&(*(y+1)))))))+=017; y[4]=(1<<5)%(1<<6); y[5]='6'*2+1; *(y+0x6)=*((**(char***)*(x+1))+3); y[(1<<3)-1]=*y==228?*y/(char)2:(char)57*2; y[(1<<3)-0]=y[(1<<3)-1]+2; y[(1<<3)+1]=*(y+6); y[012]=0x21; y[013]=y[012]-23; y[014]=y[013]-10; std::cout<<******(char*******)x; }