[英]Accessing the member of a structure by double pointer of that structure type
我有一个包含以下成员的结构Item
。
struct Item{
char *name;
int price;
double weight;
};
具有以下成员的另一个结构Inventory
。
struct Inventory{
struct Item **item;
int NUMITEMS;
};
我有一个 function addItem()
,它将Inventory*
作为其参数。
void addItem(struct Inventory* i){
printf("Enter Name:");
scanf("%s",i->item->name);
printf("Enter Price");
scanf("%d",i->item->price);
printf("Enter Weight");
scanf("%lf",i->item->weight);
}
function 的主要目标是将值分配给 Item 结构的成员。 我该怎么做? 我想通过 function 中的 item 类型的双指针设置 Item 结构成员的值。 我的整个代码是:
#include<stdio.h>
struct Item{
char *name;
int price;
double weight;
};
struct Inventory{
struct Item **item;
int NUMITEMS;
}inventory1;
struct Character{
char *name;
int Level;
long XP;
struct Inventory inventory;
};
void createCharacter(struct Character* c){
printf("Enter Name:");
c->name = (char*) malloc(40*sizeof(char));
scanf("%s",c->name);
printf("Enter Level:");
scanf("%d",&c->Level);
printf("Enter XP:");
scanf("%ld",&c->XP);
}
void viewCharacter(struct Character* b){
printf("%s level %d with %ld XP",b->name,b->Level,b->XP);
}
void addItem(struct Inventory* i){
i->item =(struct Item*)malloc(i->NUMITEMS*sizeof(struct Item));
printf("Enter name:");
scanf("%s",i->item->(*name));
}
void viewItem(struct Inventory* i){
//yet to write
}
这种结构...
struct Inventory{ struct Item **item; int NUMITEMS; }inventory1;
... 看起来像是一个数组的包装器,可能是动态分配的,指向struct Item
的指针。 实例的item
成员指向该数组中的第一个指针。 访问数组元素所指向的项的成员的方法不止一种,但由于该结构表示一个数组,最自然和直观的方法可能是使用数组语法:
struct Inventory *inv = /* ... */ ;
for (int i = 0; i < inv->NUMITEMS; ++i) {
printf("%s\n",
// here:
inv->item[i]->name
);
}
解释:由于inv
是一个指向struct Inventory
的指针,间接成员访问操作符对于访问其成员是很自然的,例如inv->item
。 就其本身而言, inv->item
是指向另一个指针的指针。 您必须取消引用它,然后取消引用结果才能获得struct Item
。 尽管您可以为此目的直接使用解引用运算符(一元*
),但数组索引运算符[]
和间接成员访问运算符->
都将解引用作为其行为的一部分(始终),因此您可以通过索引获得所需的两个解引用进入项目数组并使用间接访问运算符获取感兴趣的成员。
附加说明:
struct Inventory
的item
成员的名称可能会误导您,因为它是指向 item 的指针而不是直接指向 item 的指针,而且它的每一个外观都充当指向第一个(可能)在这样的数组中的几个项目指针,尽管它的名字是单数的。
因此,您的viewItem()
function 以及您的addItem()
function 的签名似乎不足以完成明显的任务。 如果要查看特定项目,则需要指定哪个项目,大概是通过将其索引作为附加参数传递。 如果您想在特定的 position 添加项目,则相同(而不是在已经存在的最后一个项目之后追加)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.