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

标签 c arrays pointers

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

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/

相关文章:

c - Windows XP 和 Windows 7 中的 long long int

c++ - 强制常量数据保存在RAM中而不是ROM中

c - pthread_join 后的段错误

arrays - Bash JSON 获取数组的长度

php - 如何使用php将数组值存储到mysql表中的单个单元格中?

c - (段错误)读取变量时出错,无法读取地址 X 处的变量

c++ - 错误 C2440 : 'initializing' : cannot convert from 'const int' to 'int *'

c - flex bison 编译器中的相互递归函数定义

javascript - 使用 Javascript/AngularJS 将数组中的元素移动到开头

c++ - 将对象传递到具有相同父类的数组中