구조체

Yama·2023년 12월 8일
0

어소트락 수업

목록 보기
10/55

사용자 정의 자료형(User Define Data type)

  1. 구조체(struct)
  2. 클래스(class)

구조체(struct)

struct MyDataType
{
	
};

int main()
{
	MyDataType a; 
    int size = sizeof(a);
}
  • 구조체 크기
    • 구조체 안에 아무것도 안적어 놓아도 0바이트 일수 없기 떄문에 1바이트를 최소로 잡아준다.

구조체 크기.

struct MyDataType
{
	int i;
    char c1;
    char c2;
    short s;
};

int main()
{
	MyDataType a; 
    int size = sizeof(a);
}
  • 8바이트

구조체 크기 (2).

struct MyDataType
{
	int i;
 	char c;
    char c2;
};

int main()
{
	MyDataType a; 
    int size = sizeof(a);
}
  • 8바이트
    • 8바이트가 나오는 이유:
      • 기본적으로 구조체를 구성하는 가장 큰 맴버(요소)의 크기를 배수로 확장해 나간다.

구조체 크기(3)

struct MyDataType
{
	char c;
	int i;
	short s;
};

int main()
{
	MyDataType a; 
    int size = sizeof(a);
}
  • 12바이트가 나온다.
    • 기본적으로 구조체를 구성하는 가장 큰 맴버(요소)의 크기를 배수로 확장해 나간다.
      • cxxx iiii ssxx

구조체 크기 계산하는 방법

  • 기본적으로 구조체를 구성하는 가장 큰 맴버(요소)의 크기를 배수로 확장해 나감
  • 따라서 가장 큰 요소부터 순차적으로 나열하는게 자료형의 크기를 가장 효율적으로 작게 만들어준다.
  • 해결법: #pragma pack(1)사용.

#pragma pack(1)

  • 전처리기 #pragma pack(1)로 해버리면 구조체의 확장 규칙을 1바이트로 잡는다.
  • 가장 최상단의 헤더에 이게 작성될 확률이 높다.

구조체 자료형으로 변수 선언 및 초기화

struct MyDataType
{
	char c;
	int i;
	short s;
};

int main()
{
	MyDataType a = { 1, 2, };
}
  • 배열과 비슷
  • c에 1, i에 2, s에 0들어감.

구조체 개별 요소에 접근

struct MyDataType
{
	char c;
	int i;
	short s;
};

int main()
{
	MyDataType a = { 1, 2, };

	a.i = 10;
	a.s = 0;
	a.c = 100;

	return 0;
}

구조체 개별 요소에 접근 축약

				struct MyDataType // 구조체 선언
				{
					char c1;
					int i;
					short s;
				};
                int main()
                {
					MyDataType t = {};
					// 1
					t.i = 10;
					t.s = 10;
					t.c1 = 10;


					MyDataType* pMyData = nullptr;
					pMyData = &t;
					
                    // 2
					//*pMyData; 
					(*pMyData).i = 10;
					(*pMyData).s = 10;
					(*pMyData).c1 = 10;

					// 3
					pMyData->i = 10; 
					pMyData->s = 10;
					pMyData->c1 = 10;
                    
                    return 0;
                }
  • 1번, 2번, 3번은 결과는 다 같다.
    • t.i에 10대입, t.s에 10대입 t.c1에 10대입 한것이다.
  • 2번에서 (*pMyData).i를 하는 이유는
    • 연산자 우선순위 떄문이다.
  • 3번은 2번의 축약버전이다.

typedef

  • 변수를 내가 쓰고싶은걸로 바꾸는것
typedef int MYINT;
typedef int* MYINTP;

int main()
{
	MYINT i3 = 0; 
    MYINTP k = nullptr;
}
  • 컴파일러는 MYINT를 보면 인트로 인식한다.
  • 청녹색은 자기가 만든 자료형이나 자기가 재정의 한것.

단축키

F12 : 선언위치로 간다.

강의 코드

#include <iostream>

typedef int MYINT;
typedef int* MYINTP;

// 구조체 크기 확장규칙을 1바이트로 제한
#pragma pack(1)

struct MyDataType
{
	int i;
	short s;
	char c1;
};


int main()
{
	// 구조체 자료형으로 변수 선언 및 초기화
	MyDataType a = { 1, 2, };
	int size = sizeof(a);

	// 구조체 변수의 맴버에 접근해서 값을 입력
	a.i = 10;
	a.s = 0;
	a.c1 = 100;


	{
		MyDataType t = {};


		MyDataType* pMyData = nullptr;
		pMyData = &t;

		t.i = 10;
		t.s = 10;
		t.c1 = 10;

		(*pMyData).i = 10;
		(*pMyData).s = 10;
		(*pMyData).c1 = 10;

		pMyData->i = 10;
		pMyData->s = 10;
		pMyData->c1 = 10;
	}

	return 0;
}

1차 23.12.08
2차 23.12.11
3차 23.12.12
4차 23.12.14
5차 23.12.17
6차 23.12.25
7차 24.01.01
8차 24.01.23

0개의 댓글