数组之所以复杂是因为对其定义的规则比较复杂,话说这些规则都是人为定义的,所以熟悉了规则就OK了,所谓的难度也就是对规则的熟悉度
首先对数组a[10][20]来说,数组名a代表了:
<1>第一维个元素的地址
<2>数组第一维的首地址
也就是说&a[0]==a
你定义的char *p[10];是一个数组指针:存放指针的数组,p的含义完全与a的含义对不上边了
你应该是想定义一个指针数组:指向数组的指针
应该这样:char (*p)[20];
然后比较:char a[10][20];
哪些地方不一样?
是不是就(*p)和a[10]的区别,可以认为(*p)==a[10]
那么对其&运算后就成了 &(*p)==&a[10],而&(*p)是不是就是等于p了?
所以 p==&a[10],那么也可以p==&a[0]
又根据<1>,<2>得出的结论所以 p==a
常常有这样的听说:<1>第一个元素的地址
<2>数组的首地址
这样是不准确的,因为如果是多维的数组第一个元素或者首地址都不能直接用数组名来表示,
虽然其数值是一样的但是你具体的含义是不一样的,好比如:int i=0x17ff12;如果&i的值正好是0x17ff12的话,换句话说i的地址为0x17ff12的话,那么你能说i和&i是一样的吗?
绝对的不一样,因为类型不一样嘛,同样,数组地址的值也是有类型的。
建议去看看《C语言深度剖析》这本书
p = a;
这个赋值错误!
p跟a都是数组名,不能直接给数组名赋值。