我正在玩指针以完全获得概念,然后想要减去两个指针,期望这两个地址之间的距离或东西,但显然我错了,所以这是我的代码.
int x = 5, y = 7;
int *p = &y;
int *q = &x;
printf("p is %d\nq is %d\np - q is %d", p, q, (p - q));
Run Code Online (Sandbox Code Playgroud)
为什么程序输出p - q is 1?谢谢.
Ale*_*exD 12
这是未定义的行为.根据标准(N1570):
6.5.6加法运算符
....
9当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素 ; 结果是两个数组元素的下标的差异.
请注意,在允许时,结果是下标差异.因此,如果指针指向同一类型的两个连续元素,则1无论类型的大小如何,都会给出减法.(这也许就是你了解1具体案例的原因.)
您的特殊情况是导致未定义行为的原因,因为p并q指向不相关的对象。
p-q仅当p和q指向同一数组/同一数组的最后一个元素之后,您才能理解。
int array[10];
int* p = &array[0];
int* q = &array[5];
ptrdiff_t diff1 = q - p; // Valid. diff1 is 5
ptrdiff_t diff2 = p - q; // Valid. diff2 is -5
Run Code Online (Sandbox Code Playgroud)
q - p在本例中为 5,因为它们指向数组中相距 5 个元素的元素。
换句话说,p+5等于q。如果从数组的 5 个元素开始p并跨过该数组,您将指向所q指向的数组中的同一个元素。
另外,不要使用格式说明符%d来打印指针。使用%p。用于。%tdptrdiff_t
printf(" p is %p\n q is %p\n p-q is :%td", p, q, p-q);`
// ^^ ^^
Run Code Online (Sandbox Code Playgroud)
请参阅http://en.cppreference.com/w/c/io/fprintf了解不同类型的有效格式说明符。