C语言数组名到底是个什么样的“常量”?

书上说,数组名是个指针常量,指向数组首元素的地址。于是我做了个实验:

#include <stdio.h>

int main(void)
{
    int a[3] = {1, 2, 3};

    printf("%p  %p  %p", &a, a, &a[0]);

    return 0;
}

运行结果如下:

000000000061FE14  000000000061FE14  000000000061FE14

疑惑来了:

  1. 数组名作为常量,怎能用&求出其保存地址呢?难道是常量表达式?

2.就算是常量表达式,那么它指向的地址怎么和保存自身的地址相等呢?

当然,数组怎么用我会,研究这个有点较真了,但还是希望专家答疑解惑。

数组名前边加&已经不是普通的取地址符了。虽然值一样,但编译器对a+1和&a+1的处理是不一样的

a是一个指针常量,指针常量的意思是他是一个值不能改变的变量,是变量就会有地址,因为要存储在内存中,存储在内存中就会有地址,a的值恰巧也是自己的地址,这就是数组的特性

第一个问题,a是指针常量,不能改变指向的值,相当于int * const p
第二个问题,这是一个特殊的语法规定,a虽然和&a值一样,但是类型不一样。