<分区>
我只是无法理解以下程序中的错误。我所做的是将大小为 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+1
的 ptr+1
部分,一个 1
只是被添加到 ptr
的数值中。发生了什么?