我只是无法理解以下程序中的错误。我所做的是我已经将大小为 5 的数组的地址分配给了类型为ptr(*)[]的指针。没有类型不匹配,就这样就可以了。但是后来我想打印值ptr+1ptr+1 。正如我所料,它显示了一个关于未指定边界的错误。但是当我将它转换为 type 时,它只是想念我是如何正常工作的void*。
铸造很好,但在此之前,程序如何计算ptr+1,因为它根本不知道界限?它如何知道是向前移动 5 个元素,还是向前移动 8 个元素或向前移动任何元素?为什么不(void*)ptr+1显示与 相同的错误ptr+1?
为了更好地突出整件事,我还使用了一个ctr明确声明为 type(*)[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!!我再次检查了它,在 的ptr+1部分中 (void*)ptr+1,a1只是被添加到 的数值中。ptr这是怎么回事?