指针地址空格串的储存问题

#include<stdio.h>
void fun(char* s)
{
    /**/
    int i = 0;
    char* p = s;
    while (*p)
    {
    if (*p != ' ')
    s[i++] = *p;
    p++;
    }
        s[i] = '\0';

        /**/
}
int main()
{
    char str[255];
    gets(str);
    fun(str);
        puts(str);
    return 0;
}

这是一串完整的代码。用于删除字符串中的空格并输出字符串。
在函数内部那一段指针和循环并用的代码我不能理解,这个代码去除空格的原理是什么?还请各位小伙伴赐教

下面是我的理解:


#include<stdio.h>
void fun(char* s)
{
    /**/
    int i = 0;    //从s指针指向的第一个字符开始 
    char* p = s; //指向字符串开头的指针 
    while (*p)   //如果这个指针没有指向字符串结尾的空字符'\0' 
    {
    if (*p != ' ')   //如果这个指针指向的字符不是空格,则 
    s[i++] = *p;   //这个s指针当前i的位置存入不是空格的其他字符 
    p++;   //p指针指向字符串下个位置 
    }
        s[i] = '\0';   //当判断完这个字符串,s指针当前i位置加入一个空字符,形成字符串结尾 
        /**/
}
int main()
{
    char str[255];
    gets(str);
    fun(str);
        puts(str);
    return 0;
}
 

类似于快慢指针,快的指针用来遍历字符串,慢的指针用来改变字符串的值

if (*p != ' ') //如果这个指针指向的字符不是空格,则
s[i++] = *p; //这个s指针当前i的位置存入不是空格的其他字符
经典的就是这一句,如果 *p == ' ' 等于空格时,这句 s[i++] = *p; 就不会被执行到,这里的 i ++ 也不会被执行,i 和 p 就拉开了距离。