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]不相等?
这是我的源代码:
我的机器上的输入是:
第一个值00037CD0是
本质上,这两种情况之间的区别归结为:
数组的地址与其第一个元素 的地址相同另一方面,指针的地址与指针当前指向的内容无关。
(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