为什么不能这样给指针赋值

wuyan16001 2007-09-05 07:25:02
#include<iostream.h>
void main()
{
int *p1; int i=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 *'
可是为什么可以直接给指针赋字符初值呢?
...全文
3999 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lizengyu 2010-10-14
  • 打赏
  • 举报
回复
嗯。地址是常量,指针是变量
a503015324 2009-11-14
  • 打赏
  • 举报
回复
23楼说的好.
0黄瓜0 2007-09-06
  • 打赏
  • 举报
回复
long *p3 = (long *)352; 表示p3指向编号为352的内存.如果是在保护模式下,这里不允许放入数据.
long *p3 =new long; *p=352; 表示在堆上存储整数352
long* p3; *p3 =352; 错误.往一个非法随机内存处存入数据.不过编译能过.
ddc 2007-09-06
  • 打赏
  • 举报
回复
long *p3=352
定义了一个long型指针p3,要把指针的地址改为352,这个*p3 = 352是不一样的。当然后面的都错了,因为352这个地址不是随便能用的。
wuyan16001 2007-09-06
  • 打赏
  • 举报
回复
谢谢各位的援手。不过我觉得还是有点不明白:
1. 既然 long* p3;*p3 =352;那为什么就不能合起来long *p3=352?

2.我用long *p3 = (long *)352;编译通过,但是运行结果还是不行。

3.我也用了 const long *p3 = 352; 结果还是报错 cannot convert from 'const int' to 'const long *'
xiaciping 2007-09-06
  • 打赏
  • 举报
回复
学习
licz_0124 2007-09-06
  • 打赏
  • 举报
回复
1. 既然 long* p3;*p3 =352;那为什么就不能合起来long *p3=352?

------------------------------------------------------
这个完全是2回事
long* p3;*p3 =352; 这个给p3指向的内容赋值
long *p3=352? 这个是给p3的指针赋值
....2回事
lfcai 2007-09-06
  • 打赏
  • 举报
回复
类型不匹配呀
如果你非要用一个整型值给指针初始化的话,必须要强制类型转换
long* p3 = (long*)352;
这样写很不规范的
wang_wuhui 2007-09-06
  • 打赏
  • 举报
回复
有空把char * p=NULL;
这关p,*p,**p的用图画一画,看清楚
如何使用内存的,就知道了.
ribut9225 2007-09-06
  • 打赏
  • 举报
回复
学习了
juicee 2007-09-06
  • 打赏
  • 举报
回复
- -
liqiang123abc 2007-09-06
  • 打赏
  • 举报
回复
你先搞清楚
编译器不是人
它只是一个程序
它不能象人类那样思考
在它眼里
long *p3是指针
352是数字不能相等
必须经过转换才能相等
long *p3;//先声明一个指针
*p3=352;//指针的值是352
这样才行滴
ly 2007-09-06
  • 打赏
  • 举报
回复
用C开发的人多的是了,嵌入式开发基本都用到。
ykzhen 2007-09-06
  • 打赏
  • 举报
回复
你要注意指针概念,什么时候是[声明],什么时候是[取]指针指向变量,这点一定要搞清楚。

long *p=352
//你在 [声明] 一个指针并且初始化,一个指针存放的应该是一个地址,而352是个整数,类型
//不一样,能编译通过吗?


long* p3;//你在[声明]一个指针,但是没有初始化,他就随机指向某个地址,所以这样的情况
//对于c/c++是十分危险的,编译器一般会有警告,作为程序员应该注意这点,建议初始化一下。

*p3 =352;//你在[取]指针p3所指向的整型变量,并对其赋值352
skyell 2007-09-06
  • 打赏
  • 举报
回复
看来c指针的学问非常大啊,深入学习中...
liqiang123abc 2007-09-06
  • 打赏
  • 举报
回复
学习,现在用一般单位直接用C的已经不多了,

谁说用C的已经不多了
在追求高速度和高效率的程序里
用C的仍然很多
比如杀毒 多线程的大型服务器
xugang_2001 2007-09-06
  • 打赏
  • 举报
回复
long *p;
*p = 253;

这个也是不正确的,p没有分配空间如何赋值!!!!!!!!!!!!!!!!!!!!!!!
skillful 2007-09-06
  • 打赏
  • 举报
回复
学习,现在用一般单位直接用C的已经不多了,C的指针的确是很容易出错的,要好好学习深刻理解其含义之后才能灵活运用!
zhji09 2007-09-06
  • 打赏
  • 举报
回复
这个野指针的说法再次出现了,
嘿嘿,学习
tpfly 2007-09-06
  • 打赏
  • 举报
回复 1
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";
当然没问题,因为字符串或字符数组被编译器解析为地址。而字符串常量在编译时被编译器存贮在了静态的只读数据区。
加载更多回复(6)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧