혼자 연구하는 C/C++ 13장 정리(구조체)

2015. 3. 7. 20:03창고

728x90
728x90

1. 구조체란?

구조체(Structure)를 문장화하여 정의 내리면 "타입이 다른 변수들의 집합"이라고 할 수 있으며 더 간단하게 표현하면 이종 변수 집합이다. 배열은 동종의 변수 집합이다.


기본형식

1
struct { 멤버목록 } 변수명;
cs

2. 구조체 태그

구조체 변수가 하나만 필요하다면 위의 기본 형식을 따르면 된다. 하지만 태그를 정의하고 이 태그로 구조체 변수를 선언하는 것이 일반적이다. 구조체 태그는 열거형의 태그와 마찬가지로 타입에 대해 이름을 붙이는 것이다.


기본형식

1
struct 태그명 { 멤버 목록 };
cs


키워드 struct 다음에 태그의 이름을 주고 멤버 목록을 나열한다. 태그도 일종의 명칭이므로 명칭 규칙에만 맞다면 자유롭게 사용해도 된다. 일반적으론 tag_라는 접두어를 사용한다.


C 컴파일러는 태그를 사용할 때 구조체 태그라는 것을 명확하게 알리기 위해 struct라는 키워드를 태그 앞에 붙인다.

C++ 에서는 태그가 하나의 타입으로 인정되기 때문에 struct 없이 태그명만으로도 구조체를 선언할 수 있다.


사용하기

- 타입이 정의되면 이 타입으로 같은 형의 변수를 여러 번 선언할 수 있다.
ex) tag_Friend A,B,C;

- 이 타입으로부터 파생되는 유도형 변수를 선언할 수 있다.
ex) tag_Friend *pFriend; 

- 구조체를 함수의 인수나 리턴값으로도 사용할 수 있다.

3. 멤버 연산자

구조체의 멤버를 읽을 때는 멤버 연산자를 사용한다. 모양은 마침표와 같다. 즉 점(.) 하나로 되어 있다.


기본 형식

구조체.멤버명


예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct tag_Friend {
     char Name[10];
     int Age;
     double Height;
};
 
void main()
{
     tag_Friend Friend;
 
     strcpy(Friend.Name,"아무개");
     Friend.Age=30;
     Friend.Height=178.2;
     
     printf("이름=%s, 나이=%d, 키=%.1f\n",Friend.Name,Friend.Age,Friend.Height);
}
cs


구조체의 메모리 구조



오프셋은 구조체의 시작 번지에서 멤버까지의 거리를 말한다. 오프셋 = 오프셋 앞의 멤버들의 크기의 총합.
컴파일러는 구조체가 선언될 때 각 멤버의 오프셋과 타입을 기억한다.
멤버를 참조하는 문장을 만나면 구조체의 시작 번지에서 오프셋을 더한만큼 이동한 후 이 위치에서 멤버의 타입 길이만큼
값을 읽도록 코드를 생성한다. -> 이것이 멤버 연산자.

4. 포인터 멤버 연산자
T타입이 있을 때 T형 배열과 T형 포인터를 언제든지 선언할 수 있다. 구조체에 대해서도 배열과 포인터를 선언할 수 있다.

예시

1
2
3
tag_Friend Friend;
tag_Friend *pFriend;
pFriend=&Friend;
cs

pFriend 포인터가 가리키는 구조체의 멤버를 참조하고 싶다면?

첫번째 방법(* 연산자)

pFriend 포인터기 때문에 *연산자로 이 포인터가 가리키는 곳을 역참조하게 되면 곧 Friend가 된다.

(*Friend)는 곧 Friend와 같다.


Friend 접근 메모리 구조


1
(*pFriend).Age = 30;
cs

*pFriend 연산문이 1000번지에 있는 tag_Friend 형의 구조체를 먼저 읽으며 다음으로 멤버 연산자에 의해

이 번지의 Age 멤버를 읽는다.


정리하자면 구조체의 포인터 p가 있다면 (*p).멤버로 접근할 수 있다.


두번째 방법(-> 연산자)

포인터 멤버 연산자인 ->는 좌변에 구조체 포인터, 우변에 멤버 이름을 취한다.

포인터가 가리키는 번지에 저장된 구조체의 멤버를 읽는 연산자이다.


(*pFriend).Age => pFriend->Age


괄호가 없어 훨씬 더 직관적이다!


이것도 정리하자면 p->멤버로 접근하면 된다.


728x90
반응형

'창고' 카테고리의 다른 글

국기3기 정규수업 9&10일차 메모  (0) 2015.03.11
국기3기 정규수업 8일차 메모  (0) 2015.03.09
20150308 토론정리  (0) 2015.03.08
20150307 토론정리  (0) 2015.03.07
20150306 토론정리  (2) 2015.03.07
국기3기 정규수업 6&7일차 메모  (0) 2015.03.07
(과제)입출력 함수들 비교  (0) 2015.03.06