今天遇到一个奇怪的事,为什么下面这段代码在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++报错内容:
Ubuntu的编译运行结果:
说到底,指针就是个整型值,只是代表不同的含义。非得将整型值赋值给指针,从值类型上是可以的,就砍编译器怎么考虑了
比如一个整型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;