void remove(char *buf)//配列のアドレスを受け取る
{
int n;
char *p;
char *q;

for(p=buf; ISBLANK(*p);p++) //#define ISBLANK(c) ((c)==' '||(c)=='\t')
;
q=buf;
n=strlen(p)+1;
while(n--)
*q++=*p++;
}

渡される配列の一文字目が空白の場合、空白を取り除く処理をしている関数です
whileで処理されているところがわからないので教えてください