指针的用法?该怎么解决

指针的用法?
#include   <iostream>
using   namespace   std;
void   main()
{       int   a[3][4]={0,1,2,3,4,5,6,7,8,10,11};
        int   *p;
        p=a;                
        cout < <p < <endl < <a < <endl < <a[0] < <endl;      
}

#include   <iostream>
using   namespace   std;
void   main()
{       int   a[3]={0,1,2};
        int   *p;                                                                      
        p=a;                
        cout < <p < <endl < <a < <endl < <a[0] < <endl;      
}

为什么第一个会报错,而第二个不报错?

------解决方案--------------------
为什么第一个会报错,而第二个不报错?
==========
第二个不报错??????????
------解决方案--------------------
看错了
------解决方案--------------------
我想*P是一个指针变量
p=a是指向a[3][4]的首地址指的是a[0][0]
而在后面输出a[0],所以会出错
我也只是一个新手,不知说的对不对,还请高手解释以 一下 谢谢!
------解决方案--------------------
第一个指针不是int*类型的,如果改成 p = a[0]; 就可以了。
#include <iostream>
using namespace std;
void main()
{ int a[3][4]={0,1,2,3,4,5,6,7,8,10,11};
int *p;
p=a[0]; //这样就对了
cout < <p < <endl < <a < <endl < <a[0] < <endl;

cout < < typeid( a ).name() < < endl; //看这两句输出的结果,就是a和a[0]的类型
cout < < typeid( a[0] ).name() < < endl;
}
明白了吧。
------解决方案--------------------
int a[3][4];
int *p;
这两个a、p类型不兼容,当然不能直接赋值,除非p = (int*)a强制转换

其实
int a[3][4];
int (*p)[4];
这样的话,两个类型就兼容了。p=a,编译通过……