>>275
p-s+1を一度pにして実行してみて欲しい。

こちらの環境では12番目〜が2293459番目で〜になり
17番目で〜が2293464番目で〜と表示される。

あなたの環境でも同じ番号には成らずとも�dでもない桁数での表示なる。

s[]はs[0]をスタートにしてI love dog and cat.と終端文字'\0'の19個分、s[0]〜s[18]まで用意される。
p-s+1で行っているのはprintf("%d文字目で発見しました。\n",p-s+1);実行時の
pのアドレス番地からスタート地点s[0]のアドレス番地を引いた数+1を行う.

アドレス番地s[0]は必ずしも0番から始まっているわけではないので上記で表示された�dでもない番地は
実際に12番目と17番目の'a'が入っているアドレス番地になる。

上記での例で行くとs[0]の実際の番地は2293448番地となりここをスタート番地として動く。
p-s+1で実際に計算してみると

2293459番地(pの現在番地)-2293448番地(スタート番地)+1

で答え12を引き出すことが出来る。