gpt4 book ai didi

c - 对于 (*ptr)[],为什么 printf ("%p",(void*)ptr+1) 有效但 printf ("%p",ptr+1) 无效?

转载 作者:太空宇宙 更新时间:2023-11-04 03:56:07 25 4
gpt4 key购买 nike

<分区>

我只是无法理解以下程序中的错误。我所做的是将大小为 5 的数组的地址分配给类型为 (* )[]。没有类型不匹配,就目前而言没问题。但是我想打印值 ptr+1。正如我所料,它显示了关于未指定的边界。但是当我将它转换为类型 void* 时,我只是想念相同的 ptr+1 是如何工作的。

转换很好,但在此之前,程序如何计算 ptr+1 因为它根本不知道边界?它怎么知道是向前移动 5 个元素,还是向前移动 8 个元素,还是向前移动任何元素?为什么 (void*)ptr+1 不显示与 ptr+1< 相同的错误?

为了更好地突出整个事情,我还使用了一个指针 ctr ,它被明确声明为类型 (*)[5] 而不是 (*)[]。请告诉我这背后的技术原因。谢谢。

#include<stdio.h>

int main(void)
{
int ar1[5]={1,5,3,8,9};
int (*ptr)[]=&ar1,(*ctr)[5]=&ar1;
printf("%p\n",ptr+1); //ERROR about unspecified bounds
printf("%p\n",(void*)ptr+1); //It's ok
printf("%p\n",ctr+1); //It's ok
}

PSST!! 最后两个正确的 printf() 不会产生相同的值。如果我注释掉不正确的 printf("%p\n",ptr+1); 行,这是输出。

0023FF25

0023FF38

PSST!! 我又检查了一遍,(void*)ptr+1ptr+1 部分,一个 1 只是被添加到 ptr 的数值中。发生了什么?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com