노는게 제일 좋습니다.
17회차 : 구조체 정의, 구조체 멤버 참조 본문
0. 참고 자료
http://soen.kr/
구조체 패딩 http://pangate.com/19
1. 구조체의 정의
여러 변수들을 하나로 묶어둔 것.
struct {
char a[10];
int b;
int c[5];
} studioplug;
위와 같이 a,b,c를 멤버로 가지는 studioplug라는 이름의 구조체를 정의할 수 있다.
구조체 안에 들어있는 변수를 멤버라고 한다. 구조체도 멤버가 될 수 있다. (ㄷㄷ)
studioplug.b=10;
stucioplug.c[2]=100;
멤버에 접근하고 싶으면 위와 같이 한다. 구조체 이름 뒤에 점(.)을 붙이고, 멤버를 적는다.
2. 구조체의 태그
1번항목의 studioplug와 같은 구조체가 단 하나만 필요하다면, 이미 본 예제처럼 바로 정의를 해버려도 된다.
하지만 동일한 모양의 구조체가 여러개 필요하다면, 태그를 사용할 수 있다.
struct studioplug{
char a[10];
int b;
};
위와 같은 코드를 두고 구조체 태그를 선언했다고 표현한다.
struct studioplug first;
태그를 선언한 다음에는 태그를 이용해 위와 같이 구조체를 정의할 수 있다.
strcpy_s(first.a,5,"abcd");
다음과 같이 멤버에 접근할 수 있다.
3. 구조체 포인터
struct plug {
char a;
int b;
};
struct plug g;
struct plug *gp;
gp=&g;
(*gp).a = 'a';
gp->b = 5;
printf("%c %c %c\n", g.a, (*gp).a, gp->a);
printf("%d %d %d\n", g.b, (*gp).b, gp->b);
위의 코드는 구조체의 포인터를 만들고, 이를 이용해 멤버의 값을 출력하는 동작을 한다.
struct plug *gp와 같이 포인터를 만들 수 있고, (*gp).a 또는 gp->a와 같이 멤버에 접근할 수 있다.
->는 멤버 액세스 연산자라고 한다. 좌변에 구조체 포인터, 우변에 멤버이름이 온다.
4. 구조체 배열
struct plug {
char a;
int b;
};
struct plug strArray[10];
와 같이 코드를 적으면 plug구조체를 원소로 하는 strArray배열이 만들어진다.
strArray[0].a='g'; 나, strArray[5].b=53; 같이 멤버에 접근할 수 있다.
struct plug *strPtr[10];
for(int i=0;i<10;i++){
strPtr[i]=(struct plug *)malloc(sizeof(struct plug));
}
strPtr[5]->b=53;
위와 같이 구조체 포인터를 하나 두고, 동적할당을 해줄 수도 있다.
5. 중첩 구조체
구조체 멤버로 구조체가 올 수도 있다. 단, 자기중첩이나 상호중첩은 안된다.
struct a{
struct a *b;
};
그러나 구조체 멤버로 자신의 구조체포인터를 가질 수는 있다. 이를 자기 참조 구조체 라고 한다.
struct b{
int apple;
int banana;
};
struct a{
struct b bb;
};
struct a plug;
plug.bb.apple=53;
plug.bb.banana=5353;
위 코드는 구조체 b가 구조체a의 멤버변수인 경우이다. 이 상황에서 a속 bb의 멤버변수에 접근하는 예를 보여준다.
'C' 카테고리의 다른 글
18회차(끝) : 구조체 초기화, 비트 구조체, 공용체 (0) | 2017.03.03 |
---|---|
16회차 : 문자열 함수, 수치와 문자열 (0) | 2017.03.01 |
15회차 : 배열 포인터, 배열과 문자열 (0) | 2017.02.26 |
14회차 : 첨자 연산, 포인터 배열 (0) | 2017.02.23 |
13회차 : 동적 메모리 할당, 이중 포인터 (0) | 2017.02.20 |