2012-08-24 4 views
0

다음 코드는 '2'를 네 번 인쇄합니다. 왜 '1'을 인쇄하지 않습니까? 누군가 여기서 정확히 무슨 일이 일어 났는지 설명 할 수 있습니까?공용 구조체 멤버에 대한 참조를 역 참조

#include <iostream> 

int main() { 

    union IntegersUnion { 

     int a; 
     int b; 
    }; 

    IntegersUnion q; 

    q.a = 1; 
    q.b = 2; 

    std::cout << "(*(&q.a)) = " << (*(&q.a)) << std::endl; 
    std::cout << "(*(&q.b)) = " << (*(&q.b)) << std::endl; 

    std::cout << "(*(&(q.a))) = " << (*(&(q.a))) << std::endl; 
    std::cout << "(*(&(q.b))) = " << (*(&(q.b))) << std::endl; 
    return 0; 
} 
+0

당신은 이해합니까? '합집합'은 무엇입니까? – Nim

+0

분명히 나는 ​​그렇지 않습니다. 방금 일부 설명서를 읽었지만 요점을 놓친 것 같습니다. –

+0

적절한 질문은 @ 곡선이 생각한 것입니다. 그게 내가 알고 싶어하는거야. –

답변

3

union은 구성원간에 메모리를 공유합니다. 수행 할 때 :

두 번째 지정은 a을 덮어 씁니다.

+0

그러면 int와 다른 객체의 결합이 있다면 어떻게됩니까? –

+1

유니온은 목록에서 가장 큰 항목의 크기가됩니다. 그리고 네, 한 가지만 넣고 다른 것을 꺼내서 프로그램이나 메모리를 완전히 볶을 수 있습니다. –

+0

공용 영역의 최적 사용은 메모리가 적거나 파이프를 통해 데이터를 전송할 때 상호 배타적 인 데이터입니다. 그렇다면 어떤 변수가 할당되었는지 식별 할 수있는 방법이 있어야합니다. 이는 플래그 일 수도 있고 전체적으로 데이터의 의미 일 수도 있습니다. –

1

union는 회원 모두에게 동일한 메모리를 사용한다.

따라서 q.b = 2;을 할당하면 q.a2이됩니다.

1

union의 모든 항목은 동일한 위치를 나타냅니다. 이 예에서

struct { 
    int dataTypeID; 
    union { 
     char char_here; 
     int number_here;    
    } 
} incoming_data; 

incoming_data입니다 dataTypeID는 그것이 어떤 종류의 데이터를 알려주는 파일에서 가져온 데이터 :

union의 가장 일반적인 용도는 다음과 같이한다. (이 방식으로 공간을 최적화하는 많은 파일 형식이 있습니다.)

+0

나는 그것을 downvote 것입니다,하지만 당신이 당신의 대답에 잘못된 것이있는 것 같지 않습니다. 이것이 올바른 정의 인 반면 좋은 코딩 방법에 관해선 새로운 프로그래머에게 오해의 소지가 있습니다. CPlusPlus.com은 전혀 좋은 사이트가 아닙니다. –

+0

링크를 변경하고 더 나은 링크를 제안 해 드리겠습니다. 제 답변의 진정한 요지는 두 번째 부분입니다 (왜 노동 조합을 찾을 수 있을지). – egrunin

+0

cplusplus.com에는 몇 가지 결함이 있습니다. 그것이 전체 사이트가 쓰레기라는 것을 의미하지는 않습니다. upvotes와 너무 많은 부정확 한/부정확 한 대답이 있습니다. 그것은 SO의 전체가 나쁘다는 것을 의미하지 않습니다. –

관련 문제