请问char数组与char指针的关系

请教char数组与char指针的关系
先写一个范例
C/C++ code
char a[3] = {1,2,3};
char* b = a;
printf("%d,%d\n",a,b);
printf("%d,%d\n",sizeof(a),sizeof(b));
printf("%d,%d\n",a[0],b[0]);



我对char数组和char指针就搞得不是很清了。
数组名本身就是数组首地址,那么它就应该是个指针吧?我打印他们的数值是相等的,
b指针也可以当数组名用,a数组名可以当指针用
但是sizeof时又是不等的,
这时,我就搞不懂,数组名到底是一个什么东西。这里是否与sizeof的机制有关系呢?
望各位大虾给解释一下,a和b的最根本区别,一个是指针一个是数组的话就不要说了。

------解决方案--------------------
探讨
先写一个范例

C/C++ code
char a[3] = {1,2,3};
char* b = a;
printf("%d,%d\n",a,b);
printf("%d,%d\n",sizeof(a),sizeof(b));
printf("%d,%d\n",a[0],b[0]);



我对char数组和char指针就搞得不是很清了。
数组名本身就是数组首地址,那么它……

------解决方案--------------------
解决LZ问题第一步,认识所谓数组名本身就是数组首地址是错的。
第二步:看清5L,别鸟6L。

------解决方案--------------------
char a[3] = {1,2,3};
char* b = a;
printf("%d,%d\n",a,b);
printf("%d,%d\n",sizeof(a),sizeof(b));
printf("%d,%d\n",a[0],b[0]);

sizeof(a) 表示的数组的大小,而不是a指针的大小
我们说在程序中直接打印a,打出来的是个地址,而且是a数组的地址,但是
准确来说,我们不能认为a是一个指针
a不是指针,只是我们强制打印它的值的时候,c编译器的标准处理方式是获取这个数组的首地址
也就是
printf("%d",a) 与 printf("%d",&a)
在结果上是一致的。但这种一致并不能理解为a是一个指针。
他们相同只是标准的一种处理方式而已,不然怎么办呢?如果你来设计编译器,试想,怎么处理比较好?
别人非要打印一个a,那输出什么最好呢?最好就是打印其首地址吧,这种权衡是也是c语言*度的体现。
于是*a也可以用了。

这么说吧,如果一个变量是一个数组,那么采用sizeof对其操作,二话不说,直接就计算数组的大小。
因为作为数组的变量名,在含义上相当于两重身份(数组名和可操作的指针),具有两重身份的角色,sizeof要按重要角色来处理,也是其主要角色,或者说,也是其真实的角色。

有些赘述。
简单来说吧,即便a[]中的a看起来可以和*p=a中的p很相像,但是它不是指针,可以当指针来用,但是它本质上不是指针。之所以能和指针一样用,是因为c语言的*。
换句话说,除非很有必要,否则也不建议这样用,数组就是数组,别当指针用。

不知道这样解释,可不可以接受