Q:

Указатель на массив символов char *tmp;  cin>>tmp;

Обьясните пожалуйста почему работает этот код:
cout << "Test: ";
char *tmp;
cin>>tmp;
cout << "Test: " << tmp << std::endl;

A:

tmp хранит мусорный указатель и куда то указывает.  Вам просто повезло, что та память, куда он указывает, доступна на запись.  Но никто не знает, что там хранилось до этого.  Возможно там  было что то важное. 
Инициализируйте свои переменные.  Всегда.