将 struct 成员放在单独的变量中以清理代码并帮助我了解代码的格式会如何不同
Posted
技术标签:
【中文标题】将 struct 成员放在单独的变量中以清理代码并帮助我了解代码的格式会如何不同【英文标题】:Putting a struct member inside of a separate variable to clean up code and helping me understand how the code would look formatted differently 【发布时间】:2021-09-26 18:15:23 【问题描述】:在 C 中,不只是列出一个结构变量,例如 ((struct listing*)p)
,我的变量应该是什么类型的原始类型才能保存它,它看起来如何?
例如,我目前在我的程序中有这个功能:
int price_comparator(const void* p, const void *q)
float price1 = ((struct listing*)p)->price;
float price2 = ((struct listing*)q)->price;
return (price1 - price2);
这确实有效,但是,我想以不同的方式格式化此函数。我想稍微清理一下的一种方法是将“((结构列表*)p)”放入变量中,然后再放入 price1 变量。
我想试试这样的:
struct structOne = ((listing*)p);
或
void structOne = ((listing*)p);
但据我所知,这些都不起作用。另外,括号让我有点困惑:
((struct listing*)q)->price
我希望看到它的格式不同,例如当它没有指向“价格”的箭头时,以便更清楚地了解它是如何工作的。
我的 stuct 已经在我的程序开始时创建如下:
struct listing
float latitude, longitude, price;
;
但这不需要回答我的问题
谢谢!
【问题讨论】:
【参考方案1】:您可以使用pointers to structure
代替void pointers
:
int price_comparator (struct listing *p, struct listing *q)
return (p->price - q->price);
【讨论】:
如果比较器是像qsort
这样要求参数为 const void *
的通用接口的一部分,则不可能【参考方案2】:
您可以制作正确类型的本地指针:
int price_comparator(const void* p, const void *q)
struct listing const *p1 = p;
struct listing const *q1 = q;
return p1->price - q1->price;
这里不需要强制转换,因为我们已经指定了 p1 和 q1 的类型。
【讨论】:
【参考方案3】:据我了解,您希望在不使用箭头的情况下访问结构以及要使用的数据类型。
首先:你的数据类型应该是 struct Listing * 而不是 void *。
第二:为了让打字更容易,你应该使用 typedef 声明你的结构
typedef struct
float latitude, longitude, price;
listing;
这将使使用您的结构更容易,而不是使用:
struct listing x = 2.3, 3.5, 11.0;
你可以这样做:
listing x = 2.3, 3.6, 11.5;
第三:要从 void * 访问指向结构的指针,您可以这样做:
float price1 = (*((listing *) p)).price;
float price2 = (*((listing *) q)).price;
return price1 - price2;
我希望这回答了你的问题。
【讨论】:
当p
具有const void *
类型时,*p
是不可能的
@M.M (*((listing *) p)).price 是可能的。以上是关于将 struct 成员放在单独的变量中以清理代码并帮助我了解代码的格式会如何不同的主要内容,如果未能解决你的问题,请参考以下文章