int a[5][5]; int(*p)[4]; p = a; printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]); return 0;
时间: 2024-01-05 11:03:17 浏览: 40
这段代码中定义了一个二维数组 `a`,和一个指向 `int[4]` 类型数组的指针 `p`。在赋值语句 `p = a` 中,将数组名 `a` 转换为指向数组第一行的指针,然后将其赋值给 `p`。
接下来,`printf` 语句中的表达式 `&p[4][2] - &a[4][2]` 和 `&p[4][2] - &a[4][2]` 都是指针相减的结果。这里需要注意的是,由于 `p` 指向的是 `int[4]` 类型的数组,因此 `&p[4][2]` 表示的是第 5 行第 3 列的元素地址,而 `&a[4][2]` 表示的是第 5 行第 3 列的元素地址。
指针相减的结果是一个整数,表示两个指针之间相差的元素个数。因此,表达式 `&p[4][2] - &a[4][2]` 的值等于从数组 `a` 的第 5 行第 3 列的元素地址到数组 `p` 的第 5 行第 3 列的元素地址之间相差的 `int` 类型元素的个数。由于 `p` 指向的是 `int[4]` 类型的数组,因此 `p` 每一行只有 4 个 `int` 类型元素,而 `a` 的每一行有 5 个 `int` 类型元素,因此 `&p[4][2] - &a[4][2]` 的值等于 `-1`。
另一个表达式 `&p[4][2] - &a[4][2]` 的值等于从数组 `a` 的第 5 行第 3 列的元素地址到数组 `p` 的第 5 行第 3 列的元素地址之间相差的 `int*` 类型指针的个数。由于 `p` 指向的是 `int[4]` 类型的数组,因此 `&p[4][2]` 是 `int*` 类型的指针,而 `&a[4][2]` 是 `int` 类型的指针,因此 `&p[4][2] - &a[4][2]` 的值等于 `-4`。
因此,该代码输出的结果为 `-1,-4`。
阅读全文