728x90

구조체

 

구조체는 특별 배열이다. 하나의 배열에 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

위 방법들을 통해 멤버에 접근할 수 있다.

 

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 32  (0) 2019.06.22
C언어 공부 31  (0) 2019.06.16
C언어 공부 29  (0) 2019.06.16
C언어 공부 28  (0) 2019.06.12
C언어 공부 27  (0) 2019.06.12

+ Recent posts