如果我有一个数组,如int数[5],我可以用数字[0] = 1或数字[3] = 4为它赋值。然后如果我有一个结构,如
struct structName
{
int number0;
int number1;
int number2;
};
有没有办法做类似下面的事情(注意这不是工作代码)
int main(void)
{
struct structName name; //how could i declare this to do the following
for(int i = 0; i < 2; i++)
{
name[i] = i; //maybe name.[i]
}
}
有没有办法写名[variable] = someNumber来指定someNumber来表示number0(如果变量为0)或number2(如果变量为2)。香港专业教育学院一直在寻找天,并找不到任何能做到这一点。 (也许我只是不知道该找什么)
答案 0 :(得分:5)
有什么方法可以做类似下面的事情
不,没有办法通过索引访问结构的字段。您可以使用字段的名称:
struct structName name;
name.number0 = someNumber;
name.number1 = someOtherNumber;
如果要通过索引访问值,请使用数组,即使它嵌入在结构中:
struct structName
{
int numbers[3];
// other fields here
};
然后你可以说:
struct structName name;
for (int i = 0; i <= 2, i++) {
name.numbers[i] = i;
}
答案 1 :(得分:3)
您可以编写一个使用switch语句的函数,该语句允许您按索引访问字段。类似的东西:
#include<stdio.h>
struct structName{
int number0;
int number1;
int number2;
};
void assign(struct structName * name, int i, int j){
switch(i){
case 0:
name->number0 = j;
break;
case 1:
name->number1 = j;
break;
case 2:
name->number2 = j;
break;
}
}
int main(void){
int i;
struct structName name;
for(i = 0; i <= 2; i++){
assign(&name,i,i);
}
//test:
printf("%d\n",name.number0);
printf("%d\n",name.number1);
printf("%d\n",name.number2);
return 0;
}
(按预期打印0,1,2)。
毋庸置疑,这样做没有太大意义(与只有一个数组的字段相对)除非所讨论的结构已被定义为API的一部分或已经是代码库的一部分,不容易重构。
答案 2 :(得分:1)
是的,有一些奇怪的,不可取的内存操作。你使用数组会好得多。
struct structName
{
int numbers[3];
};
int main(void)
{
struct structName name;
for(int i = 0; i <= 2; i++)
{
name.numbers[i] = i;
}
}
另请注意,您的for
循环中存在一些语法错误和一个错误。
答案 3 :(得分:-1)
带参数的宏应该可以工作
#define name(x) x
因此名称(1)将变为1.名称(2)将变为2,依此类推。
答案 4 :(得分:-1)
在C中,没有勺子。
struct structName name;
int *idx = &name; // First we need a memory address to the struct
for (int i = 0; i < sizeof(name) / sizeof(*idx); ++i) {
// idx[i] == name.numberX
idx[i] = i;
}
现在,如果你检查name.number0,name.number1,name.number2的值,你会看到它们包含正确的值。
这不是用结构做事的一种非常好的方式,但在最高回应声称不可能之后,我觉得有必要回答。