这两个打印有什么区别,我在两个打印中得到了相同的地址:
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/