关于指针的ptrdiff_t的问题
int i , j;
int* ptr1 = &i;
int* ptr2 = &j;
ptrdiff_t dt = ptr1 - ptr2; // 到底怎么算的?
int ii = ptr1 - ptr2;
//cout<<ptr1<<" "<<ptr2<<" "<<ptr1-ptr2<<endl;
cout<<dt<<endl;
cout<<ii<<endl;
以上程序输出的数分别是 993 和 3;
若把注释去掉,则输出的数是 990012FF44 、 0012FF38 、 3 、 3 、 3
[解决办法]
当指向同一数组中元素的两个指针相减时,结果是两指针所指向的数组元素的下标之差。其差值是由实现来定义一个有符号的整形,这个整形要求要和<cstddef>中定义的std::ptrdiff_t类型保持一致。由于计算时发生溢出,结果不能被这个整形所容纳时,其行为是未定义的。如果指针P和Q分别指向了同一个数组中第i个元素和第j个元素,表达式(P)-(Q)值为i ? j,而且可以被std::ptrdiff_t型变量所容纳。
此外如果P指向了某数组中任意一个元素或数组中最后一个元素的下一个元素,Q指向了同一个数组的最后一个元素,((Q)+1)-(P)、 ((Q)-(P))+1 和-((P)-((Q)+1))这三个表达式的值是一样的。当P指向数组的最后一个元素的下一个元素,上述三个表达式的值均为0,此时尽管Q+1已越界不指向数组的任何元素。除非两个指针指向同一数组中的元素,或者数组的最后元素的下一个,否则行为是没有定义。