[고급 C++] 구조체와 구조체포인터

 

  구조체와 구조체포인터

 

구조체

구조체 정의

- 서로 다른 타입의 멤버라고 하는 값들의 통합 자료형

- 사용자 정의 타입

* cf ) 배열 : 같은 타입의 데이터 모임

 

구조체 선언

#include <stdio.h>

// 변수 아니고 멤버
struct SCORE {

	char    name[20];
 	int     kor;
	int     math;
	int     eng;
	float   avg;
};

int main()
{
	// 구조체 변수
	struct SCORE st1 = {"홍길동", 50, 78, 95};
	printf("%d, %d \n", sizeof(st1), sizeof(struct SCORE));
	printf("&st1 : %p, %p\n", &st1, st1.name);

	st1.avg=(st1.kor+st1.math+st1.eng) / (float)3;
	printf("%s, %d, %d, %d, %.2f \n", st1.name, st1.kor, st1.math, st1.eng, st1.avg);
    
	return 0;
}

 

- 선언과 정의를 따로 할 수 있으며, 선언과 정의를 동시에 할 수도 있음

struct SCORE {
	char    name[20];
	int     kor;
	int     math;
	int     eng;
	float   avg;
} SCO;

 

typedef와 구조체 변수

- 재정의된 자료형

typedef struct SCORE {
	char    name[20];
	int     kor;
	int     math;
	int     eng;
	float   avg;
} SCO;

// 구조체 변수
struct SCORE st1 = {"홍길동", 50, 78, 95};
SCO tmp;



구조체 메모리 할당

- 구조체의 멤버변수는 주어진 순서대로 메모리에 할당되나

- 빈공간을 포함할 수 있으므로 효율적인 주소 사용을 위한 경계정렬이 필요함

#include <stdio.h>
int main()
{
	struct A {
		char x;      // 1
		long int y;  //  4
		char z;      //  1
	} tmp1;

	struct B {
    	long int y;  //  4
		char x;      // 1		
		char z;      //  1
	} tmp2;
    
	// 멤버 순서만 다른 구조체 크기 확인
	printf("tmp1 sizeof : %d \n", sizeof(tmp1));
	printf("tmp2 sizeof : %d \n", sizeof(tmp2));
	
	return 0;
}

tmp1 sizeof: 12
tmp2 sizeof : 8

*  tmp1 구조체의 사이즈가 6(=1+4+1)이 아닌 12인 이유

메모리 할당은 4배수(x86) 혹은 8배수(x64)로 메모리를 읽기 때문에 char ☞ 1 (+ 3),   long int ☞ 4,  char ☞ 1 (+3) 로 계산되어 12Byte 만큼 차지함

 

- #pragma pack(push, 1) : pop할때까지 현재 설정을 push해서 백업한 뒤 정렬방식 1로 설정

- #pragma pack(pop) : 백업한 것을 현재의 설정으로 되돌림. 정렬 방식 복구

#include <stdio.h>

#pragma pack 1 // 구조체 정렬 방식을 1로함

int main()
{
	struct A {
		char x;
		long int y;
		char z;
	} tmp;

	// 구조체 크기 확인
	printf("tmp sizeof : %d \n", sizeof(tmp));

	return 0;
}

tmp sizeof : 6

 

 

 

구조체 포인터

정의

- 포인터를 통하여 구조체 변수에 접근하는 개념

 

선언

- 구조체 포인터 변수도 일반 포인터 변수와 동일하게 변수명 앞에 ‘*’를 붙여 선언

- 포인터를 통해 구조체변수에 접근 가능

 

연산자

- -> : 구조체 포인터 연산자(ptr)

* cf) .  : 구조체 멤버 연산자 (st1)

 

예제

    1  #include <stdio.h>

     2

     3  typedef struct SCORE {

     5     char    name[20];     // 20

     6     int     kor;                     // 4

     7     int     math;                // 4

     8     int     eng;                   // 4

     9     float   avg;                 // 4

    10  } SCO;

    11

    12  int main()

    13  {

    14     // 구조체 변수

    15     struct SCORE st1 = {"홍길동", 50, 78, 95};

    16     SCO tmp;

    17

    18     // 구조체 포인트 변수 - 4byte 할당

    19     struct SCORE *ptr;

    20

    21     printf("%d, %d \n", sizeof(st1), sizeof(struct SCORE));

    22     printf("&st1 : %p, %p\n", &st1, st1.name);      // 시작 주소

    23
    24     st1.avg = (st1.kor+st1.math+st1.eng) / (float) 3;  // 평균 점수 구하기

    25     printf("%s, %d, %d, %d, %.2f \n", st1.name, st1.kor,  st1.math, st1.eng, st1.avg);

    27

    28     tmp = st1;

    29     printf("%s, %d, %d, %d, %.2f \n", tmp.name, tmp.kor, tmp.math, tmp.eng, tmp.avg);

    31

    32     ptr = &st1;

    33     printf("%s, %d, %d, %d, %.2f \n", ptr->name, ptr->kor,  ptr->math, ptr->eng, ptr->avg);
    34

    36     return 0;

    37  }

36, 36
&st1 : 7ffff0b0, 7ffff0b0
홍길동, 50, 78, 95, 74.33
홍길동, 50, 78, 95, 74.33
홍길동, 50, 78, 95, 74.33

- (*ptr).kor == ptr->kor

- 힙은 포인터 접근만 허용함

 

 

* 연산자 우선순위

괄호(()) → 배열첨자([])  →  구조체연산(., ->)  →  단항연산자(-,!,~,++,--,(type),&,*)

 

 


 

 

 

 

 

궁금한 사항은 댓글로 남겨주세요💃💨💫
좋아요와 구독(로그인X)은 힘이 됩니다 🙈🙉

 

반응형
그리드형

댓글

❤️김세인트가 사랑으로 키웁니다❤️