首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-05 
为什么不能这样给指针赋值#include iostream.hvoidmain(){int*p1inti350p1&ichar*p2 wuyan lon

为什么不能这样给指针赋值
#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 ";
当然没问题,因为字符串或字符数组被编译器解析为地址。而字符串常量在编译时被编译器存贮在了静态的只读数据区。

热点排行