자기참조 구조체
구조체는 구조체인데, 자기자신을 가리키는 포인터가 구조체의 맴버로 들어가 있는 구조체를 ‘자기참조 구조체‘라고 한다. 이때, 그 자기참조 구조체의 한 덩어리를 모드(Node)라고 한다. 이 모드가 자기참조를 하면 부를수록 반복이 될 텐데,
그때의 구조체의 반복되는 구조를 ‘연결 리스트‘라고 한다.
예시
바로 지난강의의 typedef로 사용자 지정 자료형을 만드는 예제 코드다. 이때, char szName[16]과 char szPhone
[16]과 구조체의 맴버로 포함
되어있는데, 추가로 *pNext, pNest포인터도 맴버로 포함
된다. 이 포인터가 구조체를 가리킨다면, 아래의 ‘연결 리스트’ 구조가 된다.
예시 활용
USERDATA user = {5, "Hoon", NULL}이라고 하고, USERDATA newuser = {5, "Hosung", NULL};으로 둘의 구조체 선언을 해준다. 물론 이때, USERDATA 구조체의 정의는 위와 같다. 그러면, 지금 경우는 포인터가 0을 가리키는데, user.pNext = &newuser; 코드 하나로, Hoon이 담긴 구조체(user)가, Hosung이 담긴 구조체(newuser)를 가리키게 되었다. (연결 리스트가 2개로 되었다)
여기서 put로 user.pNext->szName을 찍어주면, 지난시간의 구조체의 포인터처럼 newuser의 szName값인 Hosung이 나온다.
user.pNext = &newuser;에, newuser.pNext = &user;를 해주면 어떻게 될까? 서로가 서로를 가리키는 재밌는
코드가 된다. 그래서 puts로 user
.pNext->pNext->szName을 하면 가리킨 것을 가리키는 것을 출력
하게 돼서 그냥 user.szName을
출력한 것과 같은 결과가 나온다.
'c언어 > 워딩(미정리)' 카테고리의 다른 글
선형구조 및 연결 리스트 (0) | 2019.07.08 |
---|---|
비트필드, 공용체 (0) | 2019.07.08 |
구조체의 선언과 활용 (0) | 2019.07.08 |
함수 호출 규약 (0) | 2019.07.08 |
버퍼 오버런 (0) | 2019.07.08 |