2015-08-21 29 views
1

任何人都可以解释为什么数组c与结构 - 不能改变的变量

all_leds[0].pattern = 3; 

all_leds[1].pattern = 4; 

奈何?

#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; 
} 
+1

您正在分配'all_leds [0] .pattern'并打印'led_1.pattern'那些是两个不同的内存空间... –

+0

这是对某些事情的陈述。这不符合你的期望。 C具有价值语义。说'a = b;'意味着'a'具有与'b'相同的值,并不意味着它们都指向同一个对象。 – juanchopanza

+0

如果只在数组中存储指向这些结构体的指针,那么它会很有帮助吗? –

回答

2

Led是值类型(如在C的所有类型,它没有参考类型,如C++有),所以当你说all_leds[0] = led_1;你是复制led_1结构值成all_leds第一元件。在此行之后,all_leds[0]led_1保持独立的值,彼此之间没有任何连接。修改一个不会修改另一个。

取而代之,您可以使用指向Led值的指针填充all_leds

struct Led * all_leds[2] = { &led_1, &led_2 }; 
// ... 
all_leds[0]->pattern = 3; 
all_leds[1]->pattern = 4; 
1

您要复制led_1led_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; 
} 
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; 
} 
+0

很多人同时在此工作:)谢谢大家 –

0

在这些语句

printf("%d\n", led_1.pattern); // prints 1 ???? 
printf("%d\n", led_2.pattern); // prints 2 ???? 

你ouputing结构led_1led_2的数据成员。然而在这些陈述中

all_leds[0].pattern = 3; 
all_leds[1].pattern = 4; 

您更改了数组all_leds的元素。数组和对象led_1Led_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; 

在这种情况下,报表

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 ???? 

后,你会得到预期的结果。