It's not about cout, it's about expression evaluation.
1. The order in which subexpressions are evaluated is unspecified (with some exceptions that do not apply here). Depending on compiler, optimization options, platform, etc, it can go either way, so, in
cout << shishi(&hello) << endl << hello << endl; // either 4 3 or 4 4
it's unspecified whether the second hello is read before shishi() is executed to modify it, or shishi() is executed first and then the second hello is read. I get 4 and then 4 on most (but not all) compilers available to me.
2. if a scalar is modified and read from without sequencing, the behavior is undefined:
cout << ++ll << endl << ll; // ERROR!
when the behavior is undefined, anything can happen: any output, crash, whatever. You have an error in your program.
see
http://en.cppreference.com/w/cpp/language/eval_order for some details