C语言结构体指针疑问:&k->avg为何不是双重指针?
关于结构体指针中scanf参数的疑问解答
针对你提出的代码中&k->avg的写法疑问,下面直接拆解核心问题:
1. 为什么&k->avg不是双重指针?
C语言中运算符优先级有明确规则:->(结构体指针成员访问)的优先级高于&(取地址运算符)。所以&k->avg的执行逻辑是:
- 先通过
k->avg获取指针k指向的结构体实例中的avg成员(也就是main函数里的s.avg) - 再对这个成员变量取地址,最终得到的是
float*类型的指针,正好匹配scanf("%f", ...)需要的参数类型。
这和“双重指针”(struct student**类型)完全不是一回事,本质就是普通成员变量的地址。
2. &k->avg等价于&s.avg,而非&&s->avg
在main函数里你传入&s给read函数的k参数,所以k就是&s。此时k->avg等价于(*k).avg,也就是(*&s).avg,最终简化为s.avg。因此&k->avg就是&s.avg,和&&s->avg没有任何关系——后者是对s的地址再取地址,得到的是struct student**类型,完全不符合scanf的参数要求。
3. 去掉&触发段错误的原因
scanf要求第二个参数必须是变量的地址,这样它才能把用户输入的值写入对应内存。如果直接写scanf("%f", k->avg),相当于把s.avg的初始随机值当成内存地址传给scanf,scanf会尝试往这个非法地址写数据,自然触发段错误(非法内存访问)。
补充:等价的简化写法
你也可以用&(*k).avg代替&k->avg,两者完全等价,但显然&k->avg的写法更简洁直观。
内容的提问来源于stack exchange,提问作者Robert Fichera
相关产品推荐
相关产品推荐

