【 C 고 급 】 공용 체 (연합 체)

16661 단어 C고급
1. 공용 체 안내
공용 체 는 연합 체 라 고도 부 르 며 C 언어의 복합 데이터 형식 이다.공용 체 와 구조 체 가 유사 한 것 은 같은 여러 가지 데이터 유형의 집합 이다.다른 것 은 공용 체 는 같은 시각 에 하나의 데이터 형식 만 나타 내 고 구조 체 자체 에는 여러 가지 데이터 형식 이 포함 되 어 있다 는 것 이다.
'공용 체 는 같은 시각 에 하나의 데이터 형식 만 표현 할 수 있다' 는 말 을 어떻게 이해 합 니까?
데이터 형식의 측면 에서 해답 할 수 있다.데이터 형식 은 특정한 메모리 에 대해 특정한 방식 으로 분석 하 는 방법 이다. 예 를 들 어 정형 은 4 바이트 크기 의 메모리 에 대해 특정한 방식 으로 분석 하 는 방법 이다.따라서 공용 체 는 포 함 된 데이터 형식 으로 특정한 메모 리 를 분석 할 수 있다.쉽게 말 하면 공용 체 가 정형 구성원 과 문자 형 구성원 을 포함 하고 있다 면 공용 체 변 수 를 정의 한 후에 각각 정형 과 문자 형 을 사용 하여 이 변수 에 대응 하 는 메모 리 를 분석 할 수 있다. 즉, 같은 메모리 공간 을 분석 하 는 것 이다.
2. 공용 체 의 정의
공용 체 의 정의 형식 은:
union      
{
          1,
          2,
    ...
};

type: def 를 사용 하여 공용 체 형식의 이름 을 간소화 할 수 있 습 니 다.
typedef union      
{
          1,
          2,
    ...
}        ;

공용 체 이름 까지 생략:
typedef union 
{
          1,
          2,
    ...
}        ;

사용 시 생략 union 공용 체 유형 을 직접 사용 할 수 있 습 니 다.
        value;

공사 에서 공용 체 유형 은 일반적으로 _U 를 별칭 으로 하 는 결말 로 표시 한다.
3. 공용 체 의 사용 방법:
공용 체 변 수 는 직접 사용 = {0} 하여 초기 화 할 수 있 습 니 다.
공용 체 의 가장 큰 특징 은 분석 한 메모리 크기 가 공용 체 에 포 함 된 데이터 형식의 최대 분석 범위 입 니 다.예 를 들 면:
union test
{
	int a;
	char b;
};

int main(void)
{
	union test unTmp;
	printf("sizeof(unTmp) = %ld
"
, sizeof(unTmp)); // sizeof(unTmp) = 4 }

상기 공용 체 tmp 가 그 구성원 a 를 사용 할 때 공용 체 는 정형 에 따라 변수 가 있 는 메모 리 를 분석 하고 그 구성원 b 를 사용 할 때 공용 체 는 문자 형 에 따라 변수 가 있 는 메모 리 를 분석한다.예 를 들 면:
union test
{
	int a;
	char b;
};

int main(void)
{
	union test unTmp;
	unTmp.a = 70;
	printf("unTmp.a = %d
"
, unTmp.a); // unTmp.a = 70 printf("sizeof(unTmp.a) = %ld
"
, sizeof(unTmp.a)); // sizeof(unTmp.a) = 4 printf("unTmp.b = %c
"
, unTmp.b); // unTmp.b = F printf("sizeof(unTmp.b) = %ld
"
, sizeof(unTmp.b)); // sizeof(unTmp.b) = 1 return 0; }

4. 공용 체 의 응용
다음은 공사 에서 흔히 볼 수 있 는 공용 체 응용 장면 을 열거 할 것 이다.
4.1 서로 다른 종류의 같은 매개 변수 로 사용
공정 에서 공용 체 는 구조 체 에 자주 포함 되 어 나타 나 고 서로 다른 종류 에 대해 같은 파 라 메 터 를 설정 해 야 하 는 장면 에 응용 된다.
다음 장면 이 존재 한다 고 가정 합 니 다. 이 프로그램 은 두 가지 서로 다른 장치 인 Huawei 와 Apple 의 같은 프로그램 입 니 다. 현재 인 터 페 이 스 를 설계 해 야 합 니 다. 이 인 터 페 이 스 는 현재 장치 의 유형 에 따라 같은 파 라 메 터 를 설정 합 니 다.그 중에서 GetDiviceType() 이 장치 형식의 API 를 얻 기 위해 서 입 니 다.
  • 예시:
  • enum InterfaceType
    {
    	GPIO,
    	UART,
    };
    
    enum DeviceType
    {
    	HUAWEI,
    	APPLE,
    };
    
    typedef struct
    {
    	unsigned int type;
    	union
    	{
        	struct
        	{
        	    char deviceid[16];
    			unsigned int interface;
    			unsigned int pin_num;
        	} Huawei;
        	struct
        	{
         	    char deviceid[16];  
    			unsigned int interface;
        	} Apple;
    	};
    } DeviceInfo;
    
    int fun(void)
    {
    	DeviceInfo stDevinfo = {0};
    	if (GetDeviceType() == HUAWEI)
    	{
    		stDevinfo.type = HUAWEI;
    		strcpy(stDevinfo.Huawei.deviceid, "Mate30Pro");
    		stDevinfo.Huawei.interface = GPIO;
    		stDevinfo.Huawei.pin_num = 10;
    	}
    	else if (GetDeviceType() == APPLE)
    	{
    		stDevinfo.type = APPLE;
    		strcpy(stDevinfo.Apple.deviceid, "iPhone12");
    		stDevinfo.Apple.interface = UART;
    	}
    	else
    	{
    		printf("err device type !! 
    "
    ); return -1; } return 0; }

    4.2 식별 시스템 의 크기
    이 장면 은 실제 응용 과 면접 에서 흔히 볼 수 있다.
    먼저 대소 단 을 설명 하 세 요.
    서로 다른 시스템 의 저장 전략 은 역사적 인 원인 으로 인해 큰 엔 드 저장 과 작은 엔 드 저장 두 가지 모델 로 나 뉜 다.큰 끝 은 높 은 바이트 로 낮은 주소 에 저장 되 고 낮은 바이트 는 높 은 주소 에 저장 된다.작은 쪽 은 높 은 바이트 로 높 은 주소 에 저장 되 고 낮은 바이트 로 낮은 주소 에 저장 된다.실제 적 으로 네트워크 바이트 서열 은 모두 큰 엔 드 모델 이기 때문에 작은 엔 드 시스템 에 대해 반드시 크기 의 데이터 변환 을 해 야 한다.
    이 를 통 해 알 수 있 듯 이 소프트웨어 자체 식별 시스템 의 크기 는 매우 중요 한 기능 이다.
    공용 체 인식 시스템 의 크기 단 을 사용 하 는 것 은 공용 체 구성원 들 이 모두 같은 메모 리 를 사용 하 는 특징 이다.방법 은 정형 구성원 과 문자 형 구성원 을 포함 하 는 공용 체 변 수 를 정의 하고 문자 형 구성원 에 게 값 을 부여 하 며 시스템 이 작은 단 이 라 고 가정 하면 정형 구성원 의 값 은 문자 형 구성원 의 값 이다.시스템 이 대단 하 다 고 가정 하면 정형 구성원 의 값 은 0 이다.
  • 예시:
  • typedef union
    {
    	int iVar;
    	char cVar;
    } Test; 
    
    int main(void)
    {
    	Test obj = {0};
    	obj.iVar = 1;
    	
    	if (obj.iVar == obj.cVar)
    	{
    		printf("the system is little endian!
    "
    ); } else { printf("the system is big endian!
    "
    ); } return 0; }
  • 판별 원 리 는 다음 과 같다.
  • 데이터 형식 에 대응 하 는 메모리 모델 은 낮은 주소 에서 높 은 주소 로 증가 합 니 다.이상 의 공용 체 변수 obj 의 주 소 는 0x 00000000 이 라 고 가정 합 니 다. 전체 구성원 을 포함 하기 때문에 크기 는 4 바이트 입 니 다. 즉, 공용 체 변수 obj 에 대응 하 는 주소 구간 은 0x 000001000 ~ 0x000001003 입 니 다.
    현재 할당 obj. ibar 는 1 입 니 다. 즉, 이때 obj. ibar 의 값 은 0x 0000001 입 니 다.
    현재 시스템 이 대 단 일 때 메모리 상 태 는 다음 과 같 습 니 다.
    주소.
    수치
    0x00001003
    0x01
    0x00001002
    0x00
    0x00001001
    0x00
    0x00001000
    0x00
    obj. cbar 를 읽 을 때 낮은 주소 에서 바이트 하 나 를 해석 합 니 다. 이때 obj. cbar 는 0, 즉 obj. ibar! =obj.cVar。
    현재 시스템 이 작은 엔 드 일 때 메모리 상 태 는 다음 과 같 습 니 다.
    주소.
    수치
    0x00001003
    0x00
    0x00001002
    0x00
    0x00001001
    0x00
    0x00001000
    0x01
    obj. cbar 를 읽 을 때 낮은 주소 에서 바이트 하 나 를 해석 합 니 다. 이때 obj. cbar 는 1, 즉 obj. ibar = obj. cbar 입 니 다.
    더 많은 C 고급 시리즈 박문

    좋은 웹페이지 즐겨찾기