结构体指针两种赋值方式怎么会出错

typedefstructpid{floatsetvol;//设定值floatpceo;//比例系数floaticeo;//积分系数intlasterror;//上次误差... typedef struct pid
{ float setvol;//设定值
float pceo;//比例 系数
float iceo;//积分系数
int lasterror;//上次误差
int preerror;
float sumerror;
}pid;
pid volpid;
pid *sptr=&volpid;
/*pid *sptr; *sptr=&volpid;先定义,再赋值会报错。为啥呢?*/
最后一行改为:/*pid *sptr; sptr=&volpid;先定义,再赋值会报错。为啥呢?*/
展开
 我来答
john_lee1969
推荐于2017-11-26 · TA获得超过1700个赞
知道小有建树答主
回答量:419
采纳率:100%
帮助的人:528万
展开全部
pid *sptr = &volpid;
定义 pid 类型的指针并初始化为 volpid 变量的地址,注意,这里不是“赋值”,而是“初始化”。

pid *sptr; *sptr = &volpid;
给 sptr 指向的变量赋值。
错误1:类型不同,*sptr 是指向了变量,就是变量本身,而 &volpid 是变量的地址,一个是变量,一个是变量的地址。
错误2:sptr 没有初始化,给其指向的变量赋值,可能造成崩溃。
错误3:即使 sptr 已初始化,也不能为其指向的变量赋值,因为该变量类型是 struct,按 C 语言的类型划分,属于“聚集类型(aggregation)”,聚集类型不能整体赋值。
改成这样才正确:
pid *sptr; sptr = &volpid;
定义 sptr 指针,然后赋值为 volpid 变量的地址。
追问

就是改为了pid *sptr; sptr = &volpid;仍然是报错啊。

追答
初始化可以放在全局,定义 sptr 时立即赋初值,就是初始化,像这样:
pid* sptr = &volpid;

而赋值是一条语句,只能在函数里进行,像这样:
pid* sptr; // 定义 sptr 但不初始化
void main ()
{
sptr = &volpid; // 赋值
...
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式