教えてください。

たとえば
int i = 100, *ip;
double d = 123.456, *dp;
ip = &i;
dp = &d;
char *s = "abcdefg";

cout << ip << " " << dp << " " << s << endl;

このようなコードで int型やダブル型のポインタを cout で出力すると
アドレスが表示されるのに char型のポインタだと
文字列が表示されるのがいまいちよくわからなかったんですが
ずっと勉強してきてふと思ったんです。
cout で演算子オーバーロードでそうなるようにされてるのかなと。
で定義されているコードを探そうと思ったんですけど
なんかごちゃごちゃしててよくわかりません。
もし予想が当たってるならどのファイル見ればいいかでしょうか?