我在了解pointer arithmetic
时找到了以下代码:
#include <stdio.h>
int main()
{
int *p, *q, *r, a, b;
p = &a;
q = &b;
p = p-q;
r = &a;
r = (int*)(r-q);
printf("p = %p\n",p);
printf("r = %p\n",r);
}
当我编译代码时,我收到了以下警告:
test.c:7:11: warning: assignment makes pointer from integer without a cast [enabled by default]
p = q-p;
^
现在,当我运行代码时,我得到以下输出:
p = 0x1
r = 0x1
由于输出相同,任何人都可以解释警告的重要性。提前谢谢。
答案 0 :(得分:1)
你正在减去两个指针,它会给你一个整数,但你将结果存储在指针中。
答案 1 :(得分:1)
从地址中提取地址,不返回地址。它返回整数,这是这些地址之间的距离。
N1570 - 6.5.6p9:
当减去两个指针时,两个指针都指向同一个数组对象的元素, 或者超过数组对象的最后一个元素;结果是差异 两个数组元素的下标。结果的大小是实现定义的, 其类型(有符号整数类型)是 stddef.h 标题中定义的 ptrdiff_t 。 ...
答案 2 :(得分:0)
你正在减去两个指针,它会给你一个正整数,但是你将结果存储在一个指针中。所以这里强制转换是必须的......
进行类型转换如下(Typecast必须是p-q
的结果,不仅仅是p)
p = (int*)(p-q);
通过像上面那样进行类型转换,你不会收到警告......