Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有结构的C数组-无法更改变量_C_Arrays_Struct - Fatal编程技术网

具有结构的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是的,这将产生您想要的效果。许多人同时在这方面工作:)谢谢大家