结构体指针解引用传参:成员访问、传参类型及函数原型咨询
你的结构体传参问题解答
先直接拆解你关心的三个核心问题:
1. 传参方式:值传递
当你在main_logic_tick里调用state_machine.tick(*settings)时,*settings是对结构体指针的解引用,得到的是整个Settings结构体的实例。这时候传递给tick()的是这个结构体的完整副本,属于典型的值传递。也就是说,如果你在tick()里修改这个结构体的成员,只会影响副本,不会改变原来的settings变量(除非你改成传递指针或引用)。
2. 在tick()中访问结构体成员的方法
这完全取决于tick()的参数类型:
- 如果你用值传递(对应你现在的传参方式):直接用**点运算符(
.)**访问成员,比如settings.max_speed或者settings.debug_mode这种写法。 - (额外提一句:如果后续为了避免拷贝开销改成传递指针,那就要用箭头运算符(
->),比如settings_ptr->max_speed,但你的场景里是传了解引用后的结构体值,所以用.就够了)
3. tick()函数的原型定义
假设你的结构体已经用typedef定义好了,比如:
typedef struct { int max_speed; bool debug_enabled; } Settings;
情况1:值传递(匹配你当前的传参)
tick()的原型应该写成:
void tick(Settings settings);
对应的函数实现里就可以直接用.访问成员,像这样:
void tick(Settings settings) { // 访问结构体成员示例 if (settings.debug_enabled) { printf("Debug mode is on, max speed: %d\n", settings.max_speed); } }
情况2:C++下的引用传递(优化性能,避免拷贝)
如果是用C++开发,为了避免拷贝整个结构体的开销,可以改用const引用传递,原型改成:
void tick(const Settings& settings);
这时候传参还是*settings,但tick()里依然用.访问成员,而且不会创建结构体副本,效率更高。如果需要在tick()里修改原结构体的成员,就去掉const:
void tick(Settings& settings);
完整示例代码(C语言版本)
#include <stdio.h> #include <stdbool.h> // 定义Settings结构体 typedef struct { int max_speed; bool debug_enabled; } Settings; // 假设state_machine是一个包含tick函数的结构体 typedef struct { void (*tick)(Settings); } StateMachine; StateMachine state_machine; // tick函数实现 void tick(Settings settings) { printf("Accessing Settings members:\n"); printf("Max Speed: %d\n", settings.max_speed); printf("Debug Enabled: %s\n", settings.debug_enabled ? "Yes" : "No"); } // main_logic_tick函数 void main_logic_tick(Settings* settings) { // 解引用指针,传递结构体值给tick state_machine.tick(*settings); } int main() { // 初始化settings变量 Settings my_settings = {100, true}; // 绑定state_machine的tick函数 state_machine.tick = tick; // 调用main_logic_tick main_logic_tick(&my_settings); return 0; }
运行这段代码,就能看到tick()里成功访问到了Settings的成员。
内容的提问来源于stack exchange,提问作者Abdel Aleem
相关产品推荐
相关产品推荐

