| 1 2 3 4 5 6 7 8 9 10 11 12 | inta[10];int*b;int(*c)[10];intd;inte[10][2];int(*f)[2];b = a;b = &a[0];c = &a;d = a[2];f = e; | 
直接使用数组,等价于取数组首元素的地址。a等价于&a[0]。
| 1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h>intmain(intargc, char**argv){    char* array[2] = { "One", "Two"};    char* (*p)[2] = &array;    printf("%p %p\n", p, *p);    printf("%s\n", p[0][1]);    return0;} | 
输出
| 1 2 3 | $ ./a.out0x7ffebd12aa20 0x7ffebd12aa20Two | 
array和&array的值是一样的都是数组的地址。相反的,p和*p也是一样的,也是数组的地址。这里可能让人比较蒙。
另外要读取数组的的元素,需要使用p[0][n],这种方式,不能使用p[n]。但是如果转换成2级指针,那么就是可以的,这只是编译的解释不同而已:
| 1 2 | char**p2 = array;printf("%s\n", p2[0]); | 
如上输出One。
*,如果是标量类型,比如int *,那么*ptr,取的是标量的值,如指向内存区域的int的值。
如果指向的是数组,比如上述的p,那么*p,取的是数组的地址。这就是p变量存储的地址,而不是去解释该地址处的内容。因此*运算的结果,依赖于指针的类型。
对数组取*,则等价取的是数组的第一个元素,如上述*array等价于array[0]。
参考:
https://stackoverflow.com/questions/381542/with-arrays-why-is-it-the-case-that-a5-5a
https://stackoverflow.com/questions/1641957/is-an-array-name-a-pointer#