关于数组名的一个小疑点。

关于数组名的一个小问题。。。。
今天发现一个奇怪现象,比如我定义一个int a[10]数组,我输出a和&a,结果显示它们的值一样,去查了C++关于数组名的解释,发现好多都说的a是一个指针常量,那么上面的输出是不是说明指针常量就不分配内存了呢?如果我这样定义,
int a,* const ptr = &a,此时的ptr也是一个指针常量,如果我输出ptr和&ptr,结果就不一样了,此时的ptr也是指针常量,系统给它分配了4个字节的内存空间,为什么对于数组名就不行呢?后面,又拿指向函数的指针做了一个测试,测试如下,
#include<iostream>
using namespace std;
typedef void (* funPtr)(int);
void f(int a)
{
    cout << a << endl;
}
int main()
{
    funPtr ptr,ptr1;
    ptr = f ;
    ptr1 = &f;
    ptr(2);
    ptr1(2);
    return 0;
}
发现它们输出的都一样,我底层学的不好,望高手们解释下我的这个小疑惑,在此先谢过了。。。。。

------解决方案--------------------
引用:
Quote: 引用:

数组不是指针常量。
数组存在到指针的隐式类型转换,转换结果为数组首元素指针。

我的意思是数组名是指针常量,貌似我见过几本书上面都这么说的,谭浩强的C语言就是其中一本,难道数组名不是指针常量?

换本儿书吧,中毒了以后再解毒就费劲了。
------解决方案--------------------
数组就是数组,数组名可以被隐式转换为一个临时的指针常量,因为是临时的所以理所当然可读不可写
至于好几本书上都这么说,我见过的最恶心的一本C++教材直接在前言里叫嚣“真正的程序员用C++”——合着编写第一个C++编译器的程序员不是真正的程序员?
------解决方案--------------------
引用:
今天发现一个奇怪现象,比如我定义一个int a[10]数组,我输出a和&a,结果显示它们的值一样,去查了C++关于数组名的解释,发现好多都说的a是一个指针常量,那么上面的输出是不是说明指针常量就不分配内存了呢?如果我这样定义,
int a,* const ptr = &a,此时的ptr也是一个指针常量,如果我输出ptr和&ptr,结果就不一样了,此时的ptr也是指针常量,系统给它分配了4个字节的内存空间,为什么对于数组名就不行呢?后面,又拿指向函数的指针做了一个测试,测试如下,
#include<iostream>
using namespace std;
typedef void (* funPtr)(int);
void f(int a)
{
    cout << a << endl;
}
int main()
{
    funPtr ptr,ptr1;
    ptr = f ;
    ptr1 = &f;
    ptr(2);
    ptr1(2);
    return 0;
}
发现它们输出的都一样,我底层学的不好,望高手们解释下我的这个小疑惑,在此先谢过了。。。。。