首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于指针的ptrdiff_t的有关问题

2012-02-08 
关于指针的ptrdiff_t的问题int i , jint* ptr1 &iint* ptr2 &jptrdiff_tdt ptr1 - ptr2// 到底

关于指针的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已越界不指向数组的任何元素。除非两个指针指向同一数组中的元素,或者数组的最后元素的下一个,否则行为是没有定义。

热点排行