This question already has answers here:
Is this a pointer to a pointer of the start of an array?

(2个答案)



Are “array” and “&array[0]” completely interchangeable? [duplicate]

(1个答案)


4年前关闭。




我在用C语言学习数组和指针时感到困惑,为什么ch,&ch,&ch [0]彼此相等,而sptr,&sptr,&sptr [0]不相等?
这是我的源代码:
int main(void)
    {
        char ch[7] = { '1','2','3','4','5','6','0' };
        char *sptr = "132456";
        double db[4] = { 1.0,2.0,3.0,4.0 };
        printf("\n%p  %p  %p\n", ch, &ch,&ch[0]);
        printf("\n%p  %p  %p\n", sptr, &sptr,&sptr[0]);
        printf("\n%p  %p  %p\n", db, &db,&db[0]);
        return 0;

    }

我的机器上的输入是:
00FDFD68  00FDFD68  00FDFD68

00037CD0  00FDFD5C  00037CD0

00FDFD34  00FDFD34  00FDFD34

最佳答案

在大多数(尽管不是全部)上下文中,数组会“衰减”到指向其第一个元素的指针中。这就是为什么ch&ch[0]在您的示例中相同的原因(数组元素访问的优先级高于“address of”运算符,因此后者也可以写成&(ch[0]))。

剩下的&ch是数组不衰减为指针的一种情况。相反,您获得了数组的地址。很自然,它与数组的第一个元素的地址相同-但是,重要的是,它具有不同的类型。它的类型为char (*)[7],即指向包含7个元素的char数组的指针。其他两个指针的类型为char *,即指向单个char的指针。

由于sptr是指针,因此&sptr是该指针的地址,并且自然会有所不同。 &sptr[0]等效于sptr + 0,它当然等于sptr

您没有看到sptr&sptr为什么产生不同的地址的原因表明对指针的误解。指针是一个固定大小的对象,其值可以引用(指向)某种特定类型的任意对象。因为它本身是一个对象,所以可以使一个指针指向另一个对象。另一方面,数组变量始终(在其生命周期内)引用同一数组对象。

在您的示例输出中:

00037CD0  00FDFD5C  00037CD0

第一个值00037CD0是sptr指向的位置-即,它是字符串常量“132456”在内存中的位置。第二个值00FDFD5C是sptr变量本身的地址。这表明在地址00FDFD5C处有一个指针对象,该指针对象的值为00037CD0。

本质上,这两种情况之间的区别归结为:
  • 数组的地址与其第一个元素
  • 的地址相同
  • 另一方面,指针的地址与指针当前指向的内容无关。
  • 10-06 09:27