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

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 *'
可是为什么可以直接给指针赋字符初值呢?
...全文
4053 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)
内容概要:本文围绕“面向高精度电流控制的PMSM多参数PSO辨识模型研究”,系统阐述了基于Simulink的永磁同步电机(PMSM)多参数辨识方法,重点采用粒子群优化算法(PSO)实现对电机关键内部参数的高精度辨识。研究构建了完整的PMSM控制系统仿真模型,结合智能优化算法,解决了传统参数辨识中精度低、收敛慢的问题,有效提升了电流环控制的动态性能与稳态精度。该方法特别适用于对控制精度和响应速度要求较高的工业应用场景,如高性能伺服系统、电动汽车驱动系统等,具有较强的工程实用价值和科研参考意义。文中提供了完整的Simulink仿真模型与配套代码,确保了研究内容的可复现性和实践操作性。; 适合人群:具备电机控制、自动化或电气工程等相关专业背景,熟悉MATLAB/Simulink仿真环境,从事电机驱动系统研发、控制算法设计或相关领域科研工作的工程师及研究生,尤其适合工作1-5年、希望深入理解先进参数辨识技术的研发人员。; 使用场景及目标:①开展高精度PMSM控制系统的设计与参数辨识研究;②学习并掌握PSO等智能优化算法在电机系统参数辨识中的具体实现与调优技巧;③完成学术论文复现、科研项目验证、毕业设计或工程原型开发,提升对现代电机控制核心技术的理解与应用能力。; 阅读建议:建议读者结合提供的Simulink模型与源代码进行动手实践,按照文档逻辑逐步搭建与调试仿真系统,重点关注PSO算法与电机模型的交互机制、目标函数设计及参数收敛过程,通过对比不同工况下的辨识结果,深入理解算法性能与控制精度之间的内在联系。

65,211

社区成员

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

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