则*p的数据类型是受p的类型决定还是a的类型决定?

当一个指针p指向一个变量a时,利用p进行间接引用(p)时,则p的数据类型是受p的类型决定还是a的类型决定?

当然是p的类型,p = &a只是将p指针指向a变量的空间,跟类型没关系,只要能兼容就可以,不兼容可以强制转换。
比如:

int a = 10;
char *p = (char*)&a;

那么 *p肯定是char类型,不可能是int类型

当然是p的类型
比如这个代码就可以将一个int分解成4个char
int a=351;
char *p=(char *)&a;
printf("%d %d %d %d",*p,*(p+1),*(p+2),*(p+3));