之前对C语言结构体的嵌套不太熟练,最近写菜单时想通过这种形式来完成结构体嵌套下的参数关联。
首先嵌套形式下结构体拷贝与结构体间地址赋值与不嵌套并没有太大区别,写法实际一致
一般情况下结构体拷贝与结构体地址赋值
struct a
{
int p;
int d;
};
struct a b;
struct a c;
struct a *k;
int main()
{
b=c;//结构体拷贝
k=&b;//结构体地址赋值
}
拷贝与地址赋值最大的不同在于拷贝相当于将c中的所有元素赋值给b中所有元素 这样当c中元素数值改变时b中元素不会发生改变。而将b地址赋值给k相当于k与b共用一个地址,k与b就是相当于同一个结构体的两个名字,此时改变b中调用元素值也会改变使用k调用的元素值。这样的也就可以写出单片机上运行的嵌套形式结构体调用了。具体代码如下。
typedef struct
{
PID_VAR_TYPE Proportion; //
}PID;
PID angle_pid;
struct menu_struct{
int line_flag;
int col_flag;
int page_flag;
PID Speed_Wheel;
};
struct menu_struct Menu_front;
void a()
{
angle_pid.Proportion=4000;
Menu_front.Speed_Wheel=angle_pid;
}
int core0_main(void)
{
a();
while (TRUE)
{
angle_pid.Proportion=4200;
ips114_showfloat(100, 4 , Menu_front.Speed_Wheel.Proportion , 5, 3);
}
}
运行结果如下
可以看到显示数值为4000 说明两个结构体独立a函数执行后进行了拷贝 将angle_pid.Proportion赋值后不影响Menu_front.Speed_Wheel
再有结构体地址赋值操作代码
typedef struct
{
PID_VAR_TYPE Proportion; //
}PID;
PID angle_pid;
struct menu_struct{
int line_flag;
int col_flag;
int page_flag;
PID *Speed_Wheel;
};
struct menu_struct Menu_front;
void a()
{
angle_pid.Proportion=4000;
Menu_front.Speed_Wheel=&angle_pid;
}
int core0_main(void)
{
a();
while (TRUE)
{
angle_pid.Proportion=4200;
ips114_showfloat(100, 4 , Menu_front.Speed_Wheel->Proportion , 5, 3);
}
}
结果如下
angle_pid.Proportion的赋值改变,Menu_front.Speed_Wheel->Proportion也发生改变。
补充跟新一点
在使用的时候发现这个结构出现时报错时不报错的奇妙情况,在多方面查找以后,将两个结构体放在一个文件中做一个先后顺序以后解决,猜测应该时是编译的先后顺序问题,如果有大佬路过欢迎在评论区下方解答这个现象。