C中 int = (int*) - char,为什么与int = (int)(int*) - (int)char结果不一样?

问题遇到的现象和发生背景

在给几年前的代码消除warning的时候。碰到一行奇怪的代码:
int m = (int)(((int *)p[0]) - '0'); //p是个char数组
warning只是提示类型转换的size不同,按道理删掉(int *)这个强制类型转换就ok了。
在改动之前先复现一下这行代码的效果,结果就发现了这个问题:
(int)(((int *)p[0]) - '0')输出并不等于(int)(p[0]) - '0'
当时认为可能是(int *)p[0]和p[0]值不一样,但是这个类型转化应该没有改变p[0]的值,打印出来结果也一样,实在是搞不懂。
相关的代码如下:

问题相关代码
#include<stdio.h>
#include<stdlib.h>

void main()
{
    
    char p[] ="123";
    char s = '0';
    
    // '1' - '0'
    int m1 = (int)(((int *)p[0]) - s);
    int m2 = (int)(p[0] - s);
    printf("m1:%d , m2:%d\n",m1,m2);
    
    m1 = (int)(int *)p[0] - (int)s;
    printf("m1:%d\n",m1);
    
    m1 = (int *)p[0] - (int *)s;
    printf("m1:%d\n",m1);
    
    return;
}
运行结果
m1:-143 , m2:1
m1:1
m1:0

给s强行变成int*,结果反而变成0了,真是搞不懂,指针对我来说果然还是太难了...

具体我也不太懂,不知道这篇文章有没有用:
https://blog.csdn.net/zz460833359/article/details/47999775

((int *)p[0]) - s
=(int *)0x31-0x30
=(int *)(0x31-0x30*sizeof(int))
=(int *)(0x31-0xc0)=(int *)(-143);

(int)(p[0] - s)
=(int)(0x31-0x30)
=1

(int *)p[0] - (int *)s
=(int *)0x31-(int *)0x30
=(int)( (0x31-0x30)/sizeof(int) )
=(int)(1/4)
=0

你老老实实的把(int *)p[0]打印出来看到底是什么,不就知道了,为什么就不肯打印原始数据,非要打印运算结果