这样写为什么不会报错, 0是字面值整数常量啊, 字面值整数常量类型默认为int或long类型啊. 按理说0应该是int类型的常量, 难道可以复制给指针变量.
还有我测试把pi = 0换成pi = 1就报错了,可见我理解的没错啊,望高手指正!
上面这种情况在c++、c中属于是隐式类型转换。将一个指针赋值为0,其实是和赋值为NULL指针是一样的。NULL或者0表示指针不指向任何内存。
但是如果将一个非零的int型数字赋值给一个指针。这时候就有问题了。指针是用来存放变量或者函数地址的。将一个int型编程一个int*是有问题的。没有对应的隐式类型转换。但是可以显示转换
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
int a=1;
int *p=(int*)a;
cout<return 0;
}
double dval; dval=0; //默认为dval=(double)0;
int ival; ival=0; //默认为ival=(int)0;
int *pl; pl=0; //默认为pl=NULL;空指针
pl=1; //默认我pl=(int)1;导致等号左右类型不匹配,没有pi=(int *)1;这个默认只能明写了。
pi = ival = dval = 0;
这行不是把0赋给pi,而是把ival的值赋给pi,
相当于:
dval = 0;
ival = dval;//这行编译器可以执行隐式转换,将double类型转为int
pi = ival;//编译器不支持将整数类型隐式转换为指针类型,pi = (int *)ival ,可以显示的进行强制转换
对于0可以赋值给指针类型,这是因为0是特殊的,用来表示一个空指针,定义一个空指针就是
pi =NULL//NULL就是0
但是给指针赋值一般不用0,用NULL
在ASCII码的第一个字符是NULL,它的数值是0,占用1字节;C语言把它作为字符串的最后一个字符,以表示字符串到此结束."\0"
前面的pi = 0; 只是初始化可以这样做,表示空指针。
而且只能是0,否则其它数不能通过类型检查。
下面的 pi = ival = dval = 0;
从右往左读,就是把int 赋给指针地址(pi = ival),不能通过类型检查