구조체
구조체는 특별 배열이다. 하나의 배열에 int형 float형 char형 등등의 데이터가 구분되어 유지된다.
구조체 선언
struct book{
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
위 선언은 문자 배열 2개와 float 형 변수 1개로 구성된 구조체이다.
위 선언은 실제 데이터 객체를 생성하지 않고, 구조체 구성만 나타낸다. 컴파일러에게 데이터 표현 방법을 알려주지만, 데이터를 위한 기억공간을 할당하지 않는다.
구조체 변수(struct variable)
struct book library;
위 문장을 만났을 때 컴파일러는 변수 library를 생성한다. library는 MAXTITL개의 char형 배열과 MAXAUTL개의 char형 배열 , 하나의 float형 변수를 위한 메모리를 할당 받는다. 이것은 library라는 이름으로 한 덩어리를 이룬다.
구조체 개별 멤버에 접근하기 위해서 구조체 멤버연산자인 도트(.)를 사용한다. 각 변수에 접근하여 각 변수 데이터형과 동일한 방식으로 사용할 수 있다.
구조체 배열 선언
struct book library[MAXBKS];
MAXBKS 개의 원소를 가지는 배열 library를 선언한다. 각각의 원소들은 book형 구조체이다.
구조체 배열에서 멤버 식별하기
library[0].value
library[5].title
위와 같이 멤버에 접근 할 수 있다.
각원소 하나하나가 구조체 이기 때문에 위와 같이 원소를 통해 해당 구조체를 가리키고 구조체 연산자 도트(.)와 해당멤버의 이름으로 접근하면 된다.
library[2].title[4]
위의 값은 library배열의 3번쨰 원소의 title멤버의 5번째 원소를 가리킨다. 즉 하나의 값이다. 구조체도 배열이다. 그렇기 때문에 위와 같이 접근이 가능하다. 도트 연산자 왼쪽 인덱스는 구조체 배열에 적용된다.
->
library
library[2]
library[2].title
library[2].title[4]
위와 같은 순서로 접근한다.
구조체 포인터
구조체를 특별배열이라고 했지만 배열의 경우와 다르게 구조체의 이름은 구조체의 주소가 아니다.
struct guy * him;
위처럼 구조체 포인터를 선언해 줄 수 있다.
이후에 구조체 포인터에 포인터 주소를 넣어주면 된다.
him = &barney;
구조체 배열을 구조체 포인터에 넣어줄때는
him = &fellow[0];
위처럼 하면 된다. him이 fellow[0]을 가리키고 him+1이 fellow[1]을 가리키게 된다. 구조체 배열 원소 하나의 크기만큼 증가한다.
구조체 포인텅서 멤버로 접근하는 방법
1.새로운연산자 -> 를 사용한다.
위의 예시를 빌리면
him->income은 him = &barney의 경우 barney.incom이다.
him == fellow[0]의 경우 him->income은 fellow[0].income이다. 요약하면, 구조체 포인터 뒤에 ->연산자가 오는 것은 구조체 이름에 도트(.)를 쓰는 것과 같다.
2.&와 *을 사용한다.
him == &fellow[0]이면, *him == fellow[0]이다. 이것은 &와 *가 서로 상반되는 연산자이기 때문에 가능하다. 이를 통해 멤버로 접근할 수 있다.
fellow[0].income == (*him).income
도트 연산자(.)가 *연산자보다 우선순위가 높아 괄호가 필요하다. him이 barney구조체의 포인터라면
barney.incom == (*him).income == him->income
위 방법들을 통해 멤버에 접근할 수 있다.