C语言指针运算疑问:q-p输出4294967295而非-1的原因
为什么
q-p输出4294967295而不是-1? 这个问题的核心是指针相减的结果类型和printf格式符不匹配导致的隐式类型转换问题,我来一步步给你拆解清楚:
1. 指针相减的结果是什么类型?
C语言标准规定,两个指向同一数组(或者栈上相邻的局部变量,就像你的a和b)的指针相减,结果的类型是ptrdiff_t——这是一个有符号整数类型(通常和系统位数一致,32位系统对应32位有符号数,64位对应64位有符号数)。
在你的例子里,p指向a(地址2358844),q指向b(地址2358840),两者地址差4字节,而int占4字节,所以指针相减的实际结果是 q-p = (2358840 - 2358844)/4 = -1——这个-1是ptrdiff_t类型的有符号数。
2. 为什么用%u输出会得到4294967295?
%u是printf的格式符,专门用来输出无符号整数(unsigned int)。当你把一个有符号的ptrdiff_t类型的-1传给printf时,会触发隐式类型转换:有符号数-1被强制转换成unsigned int类型。
在32位系统中,有符号数-1的补码是0xFFFFFFFF,对应的无符号整数就是2^32 - 1 = 4294967295——这就是你看到的奇怪结果的由来。
3. 怎么正确输出指针差值?
你需要使用匹配ptrdiff_t类型的格式符%td,修改你的printf语句:
printf("\nq-p = %td", q-p);
这样就能正确输出-1了。
如果想输出无符号形式的差值,可以先把结果转换成size_t类型,再用%zu格式符:
printf("\nq-p (unsigned) = %zu", (size_t)(q-p));
额外的代码小建议
你的代码还有几个不符合C标准的细节,顺便提一下:
void main()应该改成int main(),C标准要求main函数返回int类型,最后记得加上return 0;#include<conio.h>是非标准头文件,GCC编译器通常不支持,getch()可以换成标准的getchar(),或者直接去掉(如果不需要暂停程序)- 输出指针地址时,用
%p格式符更标准,需要把指针强制转换成void*类型
修改后的标准代码示例:
#include<stdio.h> int main() { int a=5,b=6; int *p,*q; p=&a; q=&b; printf("p = %p\n", (void*)p); printf("q = %p\n", (void*)q); printf("q-p = %td\n", q-p); return 0; }
内容的提问来源于stack exchange,提问作者vivek bhardwaj
相关产品推荐
相关产品推荐

