C语言指针的一些问题

今天遇到一个奇怪的事,为什么下面这段代码在Windows的Devc++中编译不用过,报错误,而在Ubuntu上就能编译通过,只报了两个警告,并且a,b的值还交换成功了, t = *p 不应该是不合法格式吗?


#include <stdio.h>

void swap(int *p, int *q) 
{
    int *t; 
    t = *p; 
    *p = *q; 
    *q = t;
}

int main(int argc, const char  *argv[])
{
    
    int a = 1;
    int b = 2;

    swap(&a, &b);                                                      
    printf("a = %d, b = %d\n", a, b); 

    return 0;
}

Windows的Devc++报错内容:

img

Ubuntu的编译运行结果:

img

说到底,指针就是个整型值,只是代表不同的含义。非得将整型值赋值给指针,从值类型上是可以的,就砍编译器怎么考虑了
比如一个整型0x003DF597,可能就是一个内存地址值。如果 int *p = 0x003DF597,有些编译器是不同意的,需要 int p = (int)0x003DF597才可以。但这并非标准规范的

希望大家指点一下

t也是指针,不应该给*p(值)吧

*p 值是一个整数,
t是一个指针,是一个地址,
内存地址实际上也是一个整数,
所以t=*p是可以的,你也可以t=0x123123这样赋值,
只要你能够确认这是你需要的操作,都是可以的,
这就是Ubuntu只给你报警的原因。

虽然你结题采纳了,但是我还是想指出来,你swap写的不对,虽然结果正确。但是应该用int t;而不是int *t

int *t;
// 这里*是解引用运算符,也就是取指针p指向的地址内存中的数据,也就是一个整型数据
// 这里t是一个整型指针,本质上是一个指针,给指针赋值一个整数,理论上没有问题,
// 那么赋值的这个整数就认为是一个内存地址,所以在遇到这种赋值的时候不同编译器的处理方式不同
// 而且你这里本意只是想把p指针指向的整数暂存下来,因此应该直接定义为int t;
t = *p;