gpt4 book ai didi

c - arr 和 *arr 有什么区别?

转载 作者:行者123 更新时间:2023-11-30 20:52:54 26 4
gpt4 key购买 nike

这两个打印有什么区别,我在两个打印中得到了相同的地址:

int main(void)
{
int arr[2][3] = {{1,2,3},{4,5,6}};
printf("%p\n", arr);
printf("%p\n", *(arr));
}

最佳答案

arr是一个由 2 个 3 个数组组成的数组 int 。考虑以下三件事:

  • 数组 arr .
  • arr 的第一个子数组,也称为arr[0] .
  • arr[0]的第一个元素,也称为arr[0][0] .

这三件事是从同一个地方开始的。 arr 中的第一个子数组位于 arr 开头,所以它从 arr 开始开始。以及 arr[0] 的第一个元素位于 arr[0] 开头,并且位于 arr 开头。由于这三件事都从同一个地方开始,因此它们看起来具有相同的地址也就不足为奇了。

现在,让我们看看您打印的内容。首先,在打印指针时,您应该将其转换为 void * ,如printf("%p\n", (void *) arr); .

也就是说,printf(… arr)打印 arr[0] 的地址。为什么arr[0]而不是arr ?因为,当在这样的表达式中使用时,数组会自动转换为指向其第一个元素的指针。所以arr自动转换为指向 arr[0] 的指针,这就是printf打印。

同样,printf(… *(arr))打印 arr[0][0] 的地址。这是因为,如上所述,arr转换为指向 arr[0] 的指针。那么,由于它是一个指向 arr[0] 的指针, *(arr)适用*到该指针,结果是 arr[0] 。自 arr[0]是一个数组,它也会转换为指向其第一个元素的指针。所以结果是一个指向 arr[0][0] 的指针这就是 printf打印。

所以,您正在打印 arr[0] 的地址以及arr[0][0]的地址。由于它们从同一位置开始,因此地址相同也就不足为奇了。

(实际上并不要求打印地址会产生相同的字符串。C 标准允许实现以多种方式表示地址。因此,打印指向同一地址的两个不同指针可能会导致不同的输出. 这在现代 C 实现中相当罕见。)

关于c - arr 和 *arr 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55713975/

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