strlen()は文字数を返す関数
abcd
の入力では4が返ってる。

pは配列strのどこかを指すポインタ
初期化時は配列strの先頭を指してる。

whileループはiが偽(0)になるまで、例では4回ループする。

*(p + l) = *p はポインタpが指す位置からl番目、'\0'が入ってる位置にポインタpが指してる文字、
1ループ目では先頭のaが代入される。

*(p + l + 1) = '\0' は、↑で代入した位置の次に'\0'を代入して終端文字の修正をしてる。

printf("%s\n", ++p) は、分解すると
++p;
printf("%s\n", p);
ポインタpの指す位置から末尾に1文字移動したので、ポインタを一つずらして表示させてる。



長ったらしいのでまとめると、
配列strに文字を入力した後は
abcd\0
abcda\0
abcdab\0
abcdabc\0
って具合に一文字ずつ追加しながらポインタpも一つずつずらし、
結果入力された文字が一つずつずれて表示されてる。