array_name和&array_name有什么不同?

前者是指向数组中第一个元素的指针,后者是指向整个数组的指针。

注意;笔者建议读者读到这里时暂时放下本书,写一下指向一个含MAX个元素的字符数组的指针变量的说明。提示:使用括号。希望你不要敷衍了事,因为只有这样你才能真正了解C语言表示复杂指针的句法的奥秘。下文将介绍如何获得指向整个数组的指针。

数组是一种类型,它有三个要素,即基本类型(数组元素的类型),大小(当数组被说明为不完整类型时除外),数组的值(整个数组的值)。你可以用一个指针指向整个数组的值:
    char  a[MAX];    /*arrayOfMAXcharacters*/
    char    *p;      /*pointer to one character*/
    /*pa is declared below*/
    pa=&al
    p=a;             /* =&a[0] */
在运行了上述这段代码后,你就会发现p和pa的打印结果是一个相同的值,即p和pa指向同一个地址。但是,p和pa指向的对象是不同的。

以下这种定义并不能获得一个指向整个数组的值的指针:
    char *(ap[MAX]);
上述定义和以下定义是相同的,它们的含义都是“ap是一个含MAX个字符指针的数组”;
    char *ap[MAX];