OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4364|回复: 4

C语言结构体指针赋值和变量赋值的区别

[复制链接]

28

主题

360

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1028
金钱
1028
注册时间
2021-2-4
在线时间
146 小时
发表于 2022-6-2 16:04:32 | 显示全部楼层 |阅读模式
1金钱
如题, 看到一个电机驱动的代码都是用指针,请问这和用变量有什么区别?
是效率更加高吗?

列子1:
void Step_DIR_Write(STEP_Motor_Conf *STEP_IO_Struct, BitAction BitVal)
{
    STEP_IO_Struct->Flag_Dir = BitVal; //改变标志位
    GPIO_WriteBit(STEP_IO_Struct->Dir_PORTx, STEP_IO_Struct.Dir_PINx, BitVal);
}

例子2:
void Step_DIR_Write(STEP_Motor_Conf STEP_IO_Struct, BitAction BitVal)
{
    STEP_IO_Struct.Flag_Dir = BitVal; //改变标志位
    GPIO_WriteBit(STEP_IO_Struct.Dir_PORTx, STEP_IO_Struct.Dir_PINx, BitVal);
}

请问这两个有什么区别?
为什么都是用例子1的方式来赋值
而不是用例子2的

最佳答案

查看完整内容[请看2#楼]

结构体当然是指针传递效率最高了。如果你直接用结构体变量作为形参不是不可以,但是每次函数都要去搞一个内存给这个变量用,结构体一般比较大,不合适的。指针的话,只占一个指针的内存,当然太划算了。 另外如果你将全局变量作为形参输入函数了,并在函数内部做了值更改,函数返回,该更改也一同销毁了,全局变量并不改变。可以看看https://blog.csdn.net/gengweiba1123/article/details/88050638 另外从代码维护角度上讲,如果 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3359
金钱
3359
注册时间
2011-11-10
在线时间
207 小时
发表于 2022-6-2 16:04:33 | 显示全部楼层
结构体当然是指针传递效率最高了。如果你直接用结构体变量作为形参不是不可以,但是每次函数都要去搞一个内存给这个变量用,结构体一般比较大,不合适的。指针的话,只占一个指针的内存,当然太划算了。
另外如果你将全局变量作为形参输入函数了,并在函数内部做了值更改,函数返回,该更改也一同销毁了,全局变量并不改变。可以看看https://blog.csdn.net/gengweiba1123/article/details/88050638
另外从代码维护角度上讲,如果后期程序发生变化,结构体名称改变了,那你不需要一个一个查找去改这个名字,你直接改一条语句,指针指向的名字就行了。
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8464
金钱
8464
注册时间
2020-5-11
在线时间
3904 小时
发表于 2022-6-2 16:32:05 | 显示全部楼层
试试看例子2编译能否通过,我的理解是:若真能这样操作的话,结构体相当于局部变量了哦,函数内修改它可能对外部的结构体无影响。
专治疑难杂症
回复

使用道具 举报

11

主题

2131

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4731
金钱
4731
注册时间
2015-1-10
在线时间
591 小时
发表于 2022-6-2 16:38:35 | 显示全部楼层
实际运行的时候全局STEP_IO_Struct这个结构体里面的Flag_Dir不会改变
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2018-8-21
在线时间
10 小时
发表于 2022-6-2 16:59:46 | 显示全部楼层
使用指针作为形参,那么传入参数,指针所指向地址中的内容改变。例2里形参不会改变地址内容。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 01:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表