티스토리 뷰
2021.03.06.토
구조체 배열
✔ 구조체 변수는 멤버가 여러 개지만 구조체 변수 자체는 하나의 변수로 취급된다.
✔ 따라서 같은 형태의 구조체 변수가 많이 필요하면 배열을 선언할 수 있다.
struct person {
char *name;
int age;
char *addr;
};
int main(void){
struct person list[3] = {
{"짱구", 5, "서울"},
{"유리", 5, "부산"},
{"철수", 5, "제주"}
};
return 0;
}
✔ 구조체 배열을 선언하면 구조체 변수가 배열의 요소가 된다.
✔ 각 요소는 일정한 크기로 연속된 저장 공간에 할당된다.
✔ 구조체 배열의 초기화는 배열의 초기화 방식이 동일하다. 다만 요소가 구조체이므로 중괄호를 2개 사용하자.
printf("%s\n", people[0].name);
printf("%d\n", people[0].age);
printf("%s\n", people[0].address);
✔ 각 배열 요소를 사용할 때에는 보통의 배열과 함께 첨자를 사용한다.
✔ 그리고 요소가 구조체 변수이므로 멤버 변수의 값에 접근하기 위해 멤버 접근 연산자를 같이 사용해야 한다.
구조체 배열을 처리하는 함수
✔ 구조체 배열은 배열 요소가 구조체 변수일뿐 배열과 같다.
✔ 따라서 구조체 배열의 이름은 첫 번째 요소, 즉 첫 번째 구조체 변수의 주소를 의미한다.
✔ 구조체 배열의 요소는 총 3가지 방법을 사용해 표현할 수 있다
int main(void){
struct person list[3] = {
{"짱구", 5, "서울"},
{"유리", 5, "부산"},
{"철수", 5, "제주"}
};
list[0].name; //짱구
(*(list+1)).name; //유리
(list+2)->name //철수
return 0;
}
✔ 여러 연산자를 사용하므로, 우선순위 때문에 소괄호를 잘 사용해야 한다.
✔ 배열 요소를 참조하는 대괄호와 멤버 접근 연산자는 우선순위가 같으니, 연산 방향이 왼쪽에서 오른쪽으로 흐른다.
✔ 즉, 배열의 요소에 먼저 접근하고 해당 배열 요소의 name 멤버에 접근한다.
✔ 포인터 표현식을 사용하면 간접 참조 연산자 * 와 멤버 접근 연산자 . 의 우선순위 때문에 소괄호를 적절히 사용해야 한다.
자기 참조 구조체
✔ 개별적으로 할당된 구조체 변수들을 포인터로 연결하면, 관련 데이터를 하나로 묶어 관리할 수 있다.
✔ 이때, 자기 참조 구조체를 사용한다. 자기 참조 구조체는 자신의 구조체를 가리키는 포인터를 멤버로 가진다.
struct number {
int n;
struct number * next;
}
✔ 자신의 구조체를 가리키는 포인터 멤버를 포함하면 자기 참조 구조체를 만들 수 있다.
✔ 구조체 포인터인 next를 사용해서 다른 구조체 변수를 가리킬 수 있다.
✔ 이렇게 구조체 변수를 포인터로 연결한 것을 연결 리스트라고 한다.
✔ 연결 리스트는 첫 번째 변수의 위치만 알면 나머지 변수는 구조체 포인터가 가리키는다음 위치로 이동하고 이동하면서 모두 사용할 수 있다.
✔ 첫 번째 구조체 변수의 위치는 head 포인터를 만들어 저장하고 위처럼 사용할 수 있다.
✔ 구조체 멤버인 포인터 변수를 사용해서 다음 구조체 변수를 연결하기 때문에, 주소가 연속적이지는 않다.
#include <stdio.h>
struct link{
int num;
struct link * next;
};
int main(void){
struct link a={1,0}, b={2,0}, c={3,0};
struct link * head = &a;
a.next = &b;
b.next = &c;
//구조체 a의 멤버 num 출력
printf("%d\n",head->num);
printf("%d\n",(*head).num);
printf("%d\n\n",a.num);
//구조체 b의 멤버 num출력
printf("%d\n",head->next->num);
printf("%d\n",(*(head->next)).num);
printf("%d\n\n",b.num);
//구조체 c의 멤버 num출력
printf("%d\n",head->next->next->num);
printf("%d\n",(*((head->next)->next)).num);
printf("%d\n\n",c.num);
//구조체 포인터 current 활용하기
strudt link * current = &head;
while(current != 0){
printf("%d\n",current->num);
current=current->next;
}
}
✔ 구조체 포인터 current에 연결리스트 시작점인 head의 값을 저장한다.
✔ current에 current의 멤버인 구조체 변수 next의 값을 저장하므로 연결된 구조체 변수에 계속 접근할수있게된다.
[참고] 한빛미디어-혼자 공부하는 C언어 유튜브 강의 / 엘리스 트랙-혼자 공부하는 C언어 / 길벗-C언어 코딩 도장 / 위키백과
'BackEnd > C' 카테고리의 다른 글
[24일차] 숙제 - 코드업 1402 / 1409_포인터변수 (0) | 2021.03.09 |
---|---|
[23일차] 2. 공용체 / 열거형 / typedef (0) | 2021.03.06 |
[22일차] 2. 구조체 변수 활용 (0) | 2021.03.05 |
[22일차] 1. 구조체와 멤버 (0) | 2021.03.05 |
[21일차] 2. 동적 할당의 활용 / 명령행 인수 (0) | 2021.03.04 |