读书人

为什么不能这样给指针赋值解决办法

发布时间: 2012-03-05 11:54:01 作者: rapoo

为什么不能这样给指针赋值
#include <iostream.h>
voidmain()
{
int*p1;inti=350;
p1=&i;char *p2= "wu yan ";
long *p3=352;
cout < <p1 < < " " < <*p1 < <endl;
cout < <p2 < < " " < <*p2 < <endl;
cout < <p3 < < " " < <*p3 < <endl;
}
运行后有个问题。编译器解释下面这句:
long *p3=352;
'initializing ' : cannot convert from 'const int ' to 'long * '
可是为什么可以直接给指针赋字符初值呢?

[解决办法]
long *p3=352; 这个和
long * p3;
p3=352; //注意*不和p3这个变量名结合
是一样的,把352赋值给p3,一是类型不匹配,再者如果真的赋值成功(用强制转换)那么p3指向的地址是352,这个地址不一定是可用的。
long *p3;
*p3=352;
这段代码编译没错,向p3指向的地址中放入352这个数,但是p3的值没有初始化,它指向的地址不确定,所以p3现在是野指针,运行时也可能程序崩溃。总之,p3和*p3是不一样的。
可以这样:
long a;
long * p3=&a; //等价于 long * p3; p3=&a;
*p3=352;
这时*p3和a都是352了。

char * c= "abc ";
这个等价于
char * c;
c= "abc ";
当然没问题,因为字符串或字符数组被编译器解析为地址。而字符串常量在编译时被编译器存贮在了静态的只读数据区。

读书人网 >C++

热点推荐