c - c中的多维指针有困难吗?

标签 c pointers

我有一个使用指针的 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 , &arrchar [5][7][6] 的地址(5 个数组的 7 个数组的 6 个数组 char 的数组)。那么&arr +1是一个char [5][7][6]的地址超越&arr(&arr + 1) - &arr距离&arr&arr + 1char [5][7][6] 为单位测量, 所以距离是一个单位。

(char *)(&arr + 1) - (char *)&arr) , 两个地址转换为 char * , 所以算术以 char 为单位完成.所以结果是与&arr的距离至 &arr + 1char 为单位测量.自距离&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/

相关文章:

ios - 将 swift struct 指针传递给 C 函数

c - int 指针和 float 指针之间的奇怪区别

c - 不兼容的指针类型错误

c - pthread 缺乏同步

c - 文件指针无缘无故地过期了

c - 填充链表函数不在结构中存储数据并在打印时崩溃

c - 双向结构指针链接,C

c - 初始化指向结构体的指针的元素

c - 双指针以及如何修改函数中的指针

c - 试图释放无效指针