gpt4 book ai didi

c - 从现有结构数组中查找并返回指向结构的指针

转载 作者:行者123 更新时间:2023-11-30 18:51:43 26 4
gpt4 key购买 nike

尝试使用数组返回指向已存在结构的指针时,出现不兼容的类型错误。

以下是相关的结构定义:

typedef struct cust_t* Customer;
typedef struct item_t* Item;

struct item_t {
int id;
char *label;
};


struct cust_t {
int id;
int basket_size;
Item basket;
};

如您所见,这些结构定义了拥有一篮子商品的客户。所以basket是一个Item的数组。

然后我有以下两个功能:

/*
Add data to the item with id item_id in the basket of cust
*/
void add_item_data(Customer cust, int item_id, void* data) {
Item *v;
v = find_item(cust, item_id);

//Use the pointer to the item, v, and attribute data to it (unimplemented)
}

/*
Find the item with id id in the basket of cust, and return a pointer to it.

Assumes that the id of all items have been previously defined.
*/
Item *find_item(Customer cust, int id){

Item *v;

//Iterate over the length of basket looking for a match in the id's...
for (int i = 0; i < cust->basket_size; i++){
if (cust->basket[i].id == id){
v = cust->basket[i];
return v;
}
}
//if the item is not in the basket, return null. program should not reach here
return NULL;
}

您可以看到第二个函数假设购物篮中已经有许多商品,并且它们的 id 已经设置。 void* data 将包含 label 等信息。

我的问题出在 find_item 函数中,我希望它返回一个指向 basket 中已存在的 Item 结构的指针,所以add_item_data 可以使用它。

编译时出现以下错误:

error: incompatible types when assigning to type 'struct item_t **' from type 'struct item_t'
v = cust->basket[i];

我猜我的指针语法在某个地方出了问题,但我看不出哪里。

最佳答案

您已输入 Item作为指向 item_t指针结构。 Customer 的 typedef 也有类似的情况。这在语义上是很尴尬的。安Item *可以更好地解释为一个 Items 数组,特别是指向数组中第一个 Item 的地址的指针。如果您不熟悉数组和指针的概念,这里有一个入门指南(对于 C++,但概念在两种语言中都是相同的,唯一特定于 C++ 的部分是使用 std::cout << 打印到控制台): http://www.learncpp.com/cpp-tutorial/6-8-pointers-and-arrays/ (这个和下一个,特别是关于 [] 运算符的部分)

您的函数find_item将返回一个指向 Item 的指针。 Item 是指向 item_t 的指针,因此最终得到 item_t **类型。指向 item_t 的指针。

v,如上所述,是 item_t ** , 最终。客户是 cust_t * 。在 if 语句中,您实际上正确地使用了链接中的概念: cust->basket[i].id

basket指向一个 item_t。您使用 [] 运算符,它将指针偏移 i,然后取消引用 THAT 指针。换句话说,basket[i]*(basket + i) 相同

这意味着你得到一个实际的item_t,而不是指针。然后就在它下面,你误用了这个概念。 basket[i]返回一个实际的 item_t 并且您尝试将其分配给 item_t ** (因此你的错误)。 Actor 阵容没有帮助,这不是你的问题。您正试图将苹果变成一 block 奶酪。

我建议您从顶部开始,不要在 typedef 中隐藏指针。这使得阅读起来很困惑。根据你的话,“我希望它返回一个指向已经存在的 Item 结构的指针” 我认为你误解了你所做的事情。您不是返回一个指向项目结构的指针,而是返回一个指针...指向项目结构的指针。

不管怎样,你说你不能因为任何原因改变 typedef,所以只是为了让你至少能工作(尽管我不确定这实际上会达到你的想法),改变函数的返回类型到只是一个项目,并将从数组中提取的内容的地址分配给 v。像这样:(未经验证,但希望您明白这一点)

Item find_item(Customer cust, int id){

Item v;
//snip snip
v = &(cust->basket[i]); //using & as address-of operator here
return v;
//snip snip

编辑:查看您的评论,我认为您可能不熟悉“address-of”运算符。这就是如何获取指向存在的东西的指针。 cust->basket[i]是一个 item_t,& 获取该 item_t 的地址,您可以将其分配给一个 item_t 指针,该指针已被键入定义为 Item。

关于c - 从现有结构数组中查找并返回指向结构的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36230965/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com