*p2に代入していいのはchar型変数だから、pを代入すると警告が出る。

宣言時の初期化char *p2 = p; は
char *p2;
p2 = p;
と同じ意味で、
char *p2;
*p2 = p;
とは全くの別物。