指针运算:警告:赋值使整数指针没有强制转换[默认启用]

时间:2014-09-15 10:28:27

标签: c pointers warnings pointer-arithmetic

我在了解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

由于输出相同,任何人都可以解释警告的重要性。提前谢谢。

3 个答案:

答案 0 :(得分:1)

你正在减去两个指针,它会给你一个整数,但你将结果存储在指针中。

答案 1 :(得分:1)

从地址中提取地址,不返回地址。它返回整数,这是这些地址之间的距离。

N1570 - 6.5.6p9:

  

当减去两个指针时,两个指针都指向同一个数组对象的元素,   或者超过数组对象的最后一个元素;结果是差异   两个数组元素的下标。结果的大小是实现定义的,   其类型(有符号整数类型)是 stddef.h 标题中定义的 ptrdiff_t 。 ...

答案 2 :(得分:0)

你正在减去两个指针,它会给你一个正整数,但是你将结果存储在一个指针中。所以这里强制转换是必须的.​​.....

进行类型转换如下(Typecast必须是p-q的结果,不仅仅是p)

    p = (int*)(p-q);

通过像上面那样进行类型转换,你不会收到警告......