C语言 const关键字问题

例子1

 # include<stdio.h>
void main()
{
    char **p1;
    const char **p2=p1;
}
//[Warning] initialization from incompatible pointer type [enabled by default]

例子2

 # include<stdio.h>
void main()
{
    char *p1;
    const char *p2=p1;
}
//编译通过,且无Warning

我在网上查资料都说 例子1 是因为:p1指向 char *类型,p2指向const char *类型
所以,两者类型冲突,导致编译器报 Warning

但是对于 例子2:p1指向 char 类型,p2指向const char 类型,两者类型也不同,
为什么就不报 Warning呢?????

请大牛们指导!!!!

http://www.cnblogs.com/rushuizhijing/archive/2011/08/26/2154737.html

个人理解,例二中const p 2= p1,是让p2和p1指向同一个地址,并且不能通过p2改变地址上的值,本身是没有错误。
然而例一中,
*p1,p1中存的是一个指针的地址,指针然后在指向一个地址,直接将p1的地址复制给const p2,那
么就达不到const的效果,只是不能修改p2中所保存的指针地址,但是
p可以通过*p的指向来改变**p的内容,因而报警告,
感觉改成char *const *p2 = p1,就不会有这个警告了吧。新手一枚,理解错误,希望大牛指导

第一个修饰的是二级指针,二级指针里面存放的是一级指针的地址,这个地址还会指向内存的一片内存,第二个修饰的是一级指针,里面存放的是一个变量的地址。最后改变const修饰一级指针就行了 const * char *p2