1. si un puntero solo almacena una direccion de memoria ¿por que al ejecutarse el el codigo la linea cout<<cadena2 no muestra una direccion de memoria sino que muestra una cadena de caracter? R.- Esto es debido a la forma en como funciona el metodo cout, el metodo cout
verifica el tipo de sus parametros, y segun el tipo que sea, llama a la subrutina adecuada para mostrar esa variable en pantalla. si detecta que la variable es de tipo int, llama a la rutina para imprimir int, si detecta que es de tipo float, llama a la rutina para imprimir float, si detecta que quieres imprimir un char* o un char[], llama a la rutina de impresion de cadenas. Esto funciona asi gracias a algo lamado sobrecarga de funciones en C++. De hecho es posible crear nuevos "tipos de datos", y decirle a cout la manera en como queremos que se impriman esos datos. Busca mas informacion acerca de Sobrecarga de funciones y operadores.
Antes de C++, si era necesario ser especifico en cuanto al tipo de dato a imprimir, si tu utilizas:
// Muestra la direccion de la cadena
printf("%x", cadena2);
// Mustra la cadena
printf("%s", cadena2);
El primero si te muestra la direccion en memoria de cadena2 en formato hexadecimal (%x), y el segundo te muestra cadena2 como si fuera una cadena (%s). Como dije antes, cout automaticamente verifica el tipo de parametro y llama a la rutina adecuada, cosa que printf no hacia.
2. ¿por que si en la anterior linea se coloca un * antes de cadena2, se muestra solo el primer caracter osea C?R. Esto es debido al operador *, al hacerlo, cout deja de creer que es un char* y lo toma como char.
3. es posible asignar una cadena de caracteres a un puntero de esa forma fuera de la declaracion (es decir en cualquier parte del codigo)? ¿como?.Esto ultimo no lo entendi, tendrias que replantearlo de una manera mas clara
Espero haberte aclarado un poco
Saludos y hasta mañana