具有结构的C数组-无法更改变量
有人能解释为什么吗具有结构的C数组-无法更改变量,c,arrays,struct,C,Arrays,Struct,有人能解释为什么吗 all_leds[0].pattern = 3; 及 什么也不做 #include <stdio.h> int main(void) { struct Led { int pin; int pattern; }; struct Led led_1 = {1, 1}; struct Led led_2 = {2, 2}; printf("%d\n", led_1.pattern); /
all_leds[0].pattern = 3;
及
什么也不做
#include <stdio.h>
int main(void)
{
struct Led
{
int pin;
int pattern;
};
struct Led led_1 = {1, 1};
struct Led led_2 = {2, 2};
printf("%d\n", led_1.pattern); // prints 1
printf("%d\n", led_2.pattern); // prints 2
struct Led all_leds[2];
all_leds[0] = led_1;
all_leds[1] = led_2;
printf("%d\n", led_1.pattern); // prints 1
printf("%d\n", led_2.pattern); // prints 2
all_leds[0].pattern = 3;
all_leds[1].pattern = 4;
printf("%d\n", led_1.pattern); // prints 1 ????
printf("%d\n", led_2.pattern); // prints 2 ????
return 0;
}
#包括
内部主(空)
{
结构发光二极管
{
int引脚;
int模式;
};
结构Led Led_1={1,1};
结构Led Led_2={2,2};
printf(“%d\n”,led_1.图案);//打印1
printf(“%d\n”,led_2.图案);//打印2
结构Led所有_Led[2];
所有_发光二极管[0]=发光二极管_1;
所有_发光二极管[1]=发光二极管_2;
printf(“%d\n”,led_1.图案);//打印1
printf(“%d\n”,led_2.图案);//打印2
所有指示灯[0]。模式=3;
所有_发光二极管[1]。模式=4;
printf(“%d\n”,led_1.图案);//打印1????
printf(“%d\n”,led_2.图案);//打印2????
返回0;
}
<代码> >代码> LED <代码>是一个值类型(如C中所有类型一样;它没有C++那样的引用类型),所以当你说“代码> AlLeLeDS [0 ] = LeDy1;您正在将发光二极管1
中的结构值复制到所有发光二极管的第一个元素中。在这一行之后,所有的发光二极管[0]
和发光二极管1
保持独立的值,彼此之间没有连接。修改一个不会修改另一个
相反,您可以用指向Led
值的指针填充所有的\u Led
struct Led * all_leds[2] = { &led_1, &led_2 };
// ...
all_leds[0]->pattern = 3;
all_leds[1]->pattern = 4;
您正在将led_1
和led_2
的值复制到结构数组中。如果希望它们是相同的对象,则应使数组成为指向结构的指针数组,然后可以通过引用更新它们
#include <stdio.h>
int main(void)
{
struct Led
{
int pin;
int pattern;
};
struct Led led_1 = {1, 1};
struct Led led_2 = {2, 2};
printf("%d\n", led_1.pattern); // prints 1
printf("%d\n", led_2.pattern); // prints 2
struct Led *all_leds[2];
all_leds[0] = &led_1;
all_leds[1] = &led_2;
printf("%d\n", led_1.pattern); // prints 1
printf("%d\n", led_2.pattern); // prints 2
all_leds[0]->pattern = 3;
all_leds[1]->pattern = 4;
printf("%d\n", led_1.pattern);
printf("%d\n", led_2.pattern);
return 0;
}
#包括
内部主(空)
{
结构发光二极管
{
int引脚;
int模式;
};
结构Led Led_1={1,1};
结构Led Led_2={2,2};
printf(“%d\n”,led_1.图案);//打印1
printf(“%d\n”,led_2.图案);//打印2
结构发光二极管*所有发光二极管[2];
所有发光二极管[0]=&led\u 1;
所有_发光二极管[1]=&led_2;
printf(“%d\n”,led_1.图案);//打印1
printf(“%d\n”,led_2.图案);//打印2
所有发光二极管[0]->图案=3;
所有_LED[1]->图案=4;
printf(“%d\n”,led_1.图案);
printf(“%d\n”,led_2.图案);
返回0;
}
好的,我找到了这个,它按预期工作:
#include <stdio.h>
int main(void)
{
struct Led
{
int pin;
int pattern;
};
struct Led led_1 = {1, 1};
struct Led led_2 = {2, 2};
printf("%d\n", led_1.pattern);
printf("%d\n", led_2.pattern);
struct Led * all_leds[2];
all_leds[0] = &led_1;
all_leds[1] = &led_2;
printf("%d\n", led_1.pattern);
printf("%d\n", led_2.pattern);
all_leds[0] -> pattern = 3;
all_leds[1] -> pattern = 4;
printf("%d\n", led_1.pattern);
printf("%d\n", led_2.pattern);
return 0;
}
#包括
内部主(空)
{
结构发光二极管
{
int引脚;
int模式;
};
结构Led Led_1={1,1};
结构Led Led_2={2,2};
printf(“%d\n”,led_1.图案);
printf(“%d\n”,led_2.图案);
结构发光二极管*所有发光二极管[2];
所有发光二极管[0]=&led\u 1;
所有_发光二极管[1]=&led_2;
printf(“%d\n”,led_1.图案);
printf(“%d\n”,led_2.图案);
所有发光二极管[0]->图案=3;
所有_LED[1]->图案=4;
printf(“%d\n”,led_1.图案);
printf(“%d\n”,led_2.图案);
返回0;
}
在这些语句中
printf("%d\n", led_1.pattern); // prints 1 ????
printf("%d\n", led_2.pattern); // prints 2 ????
all_leds[0].pattern = 3;
all_leds[1].pattern = 4;
all_leds[0]->pattern = 3;
all_leds[1]->pattern = 4;
您正在输出结构led_1
和led_2
的数据成员。然而,在这些声明中
printf("%d\n", led_1.pattern); // prints 1 ????
printf("%d\n", led_2.pattern); // prints 2 ????
all_leds[0].pattern = 3;
all_leds[1].pattern = 4;
all_leds[0]->pattern = 3;
all_leds[1]->pattern = 4;
您更改了阵列所有\u LED的元素。数组和对象led_1
和led_2
是不同的对象,占用不同的内存区域。因此,更改一个对象不会影响其他对象
也许你的意思是
printf("%d\n", all_leds[0].pattern); // prints 1 ????
printf("%d\n", all_leds[1].pattern); // prints 2 ????
或者可以定义指向结构的指针数组。比如说
struct Led *all_leds[2];
*all_leds[0] = &led_1;
*all_leds[1] = &led_2;
在这种情况下,在陈述之后
printf("%d\n", led_1.pattern); // prints 1 ????
printf("%d\n", led_2.pattern); // prints 2 ????
all_leds[0].pattern = 3;
all_leds[1].pattern = 4;
all_leds[0]->pattern = 3;
all_leds[1]->pattern = 4;
及
您将得到预期的结果。您正在分配给所有led[0]。模式和打印led\u 1。模式这是两个不同的内存空间…这些语句用于某些内容。这不是你所期望的。C具有值语义。说a=b
意味着a
与b
具有相同的值,但这并不意味着它们都引用同一个对象。因此,在数组中只存储指向这些结构的指针会有帮助吗?@stepper\m是的,这将产生您想要的效果。许多人同时在这方面工作:)谢谢大家