gpt4 book ai didi

c - C语言中数组、&array、&array[0]的区别是什么?

转载 作者:行者123 更新时间:2023-12-02 06:29:31 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





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。

本质上,这两种情况之间的区别归结为:
  • 数组的地址与其第一个元素的地址相同
  • 另一方面,指针的地址与指针当前指向的内容无关。
  • 关于c - C语言中数组、&array、&array[0]的区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43542407/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com