اولین چیزی که بهتره بدونید اینه که آرایه خودش اشارهگری به عنصر اول آرایه است. به عنوان مثال اگر
int A[5] = {6,7,8,9,10};
آنگاه
A == &A[0]
A[1] == *(A+1)
&A[1] == A+1
این تساوی آخری درک کاملی از اشارهگر به شما میده. فرض کنید
int *B;
در این صورت B به یک بلوک ۴ بایتی (بسته به معماری سیستم) از حافظه اشاره داره و B+1 اشاره به ۴ بایت بعدی (چسبیده به قبلی) داره. حالا اگر از اول
short int *B
در این صورت B به یک بلوک ۲ بایتی (بسته به معماری سیستم) از حافظه اشاره داره و B+1 اشاره به ۲ بایت بعدی (چسبیده به قبلی) داره.
دوم اینکه پایان یک char [] با '\0' مشخص میشه (ولی string این محدودیت رو نداره).
سوال شما: strcpy دو اشارهگر به char رو میگیره مقدار اشارهٔ دومی رو در مقدار اشارهٔ اولی میریزه. بعد به بلوک بعدی هر دو میره و این کار رو تکرار میکنه تا به کاراکتر پایانی '\0' از رشتهٔ دومی برسه. در کد شما، کاراکترهای از مکان position+1 به بعد یکی یکی به مکان قبلی خودشون منتقل میشن و بنابراین کاراکتر مکان position حذف میشه.