我有一个使用指针的 C 程序,但我无法理解输出。为什么第一个输出是1
,另一个是210
。它们都是指向 3 维数组的指针。
我找不到解决方案
int main() {
char arr[5][7][6];
char (*p)[5][7][6] = &arr;
printf("%d\n", (&arr + 1) - &arr);
printf("%d\n", (char *)(&arr + 1) - (char *)&arr);
printf("%d\n", (unsigned)(arr + 1) - (unsigned)arr);
printf("%d\n", (unsigned)(p + 1) - (unsigned)p);
return 0;
}
第一个输出是1
,最后一个是210
最佳答案
C 以指向的类型为单位进行指针运算。
在(&arr + 1) - &arr
, &arr
是 char [5][7][6]
的地址(5 个数组的 7 个数组的 6 个数组 char
的数组)。那么&arr +1
是一个char [5][7][6]
的地址超越&arr
和 (&arr + 1) - &arr
距离&arr
至 &arr + 1
以 char [5][7][6]
为单位测量, 所以距离是一个单位。
在(char *)(&arr + 1) - (char *)&arr)
, 两个地址转换为 char *
, 所以算术以 char
为单位完成.所以结果是与&arr
的距离至 &arr + 1
以 char
为单位测量.自距离&arr
至 &arr + 1
是一个char [5][7][6]
, 它是 5•7•6 char
, 即 210 char
, 所以结果是 210。
杂费
不要使用 %d
打印减去指针的结果。当两个指针相减时,结果的类型是ptrdiff_t
, 它可能会打印成 %td
, 如 printf("%td\n", (&arr + 1) - &arr));
.
要将指针转换为整数,最好使用uintptr_t
。 , 在 <stdint.h>
中定义, 而不是 unsigned
.
打印unsigned
值,使用 %u
, 不是 %d
.
打印uintptr_t
值,包括 <inttypes.h>
并使用 "%" PRIuPTR
, 如 printf("%" PRIuPTR "\n", (uintptr_t) (p + 1) - (uintptr_t) p);
.
关于c - c中的多维指针有困难吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56714115/