我只是无法理解以下程序中的错误。我所做的是我已经将大小为 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
这是怎么回事?