티스토리 뷰

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언어 코딩 도장 / 위키백과

댓글
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
최근에 올라온 글
글 보관함
Total
Today
Yesterday