프로그래밍/C언어

구조체 정리 C언어

콘파냐 2014. 2. 25. 20:02

배열은 한가지 Type만을 요소로 갖는다. 그래서 좀 더 다양한 자료들을 사용하기 위해서는 구조체를 사용한다. 배열은 각 요소들의 타입이 같기 때문에 일련적인 수로서 각 요소에 점근 할 수 있었다. 예를들면 arr[7] 이런식이었다. 이런 접근은 포인터 연산인데 각 요소들의 타입이 한가지기 때문에 포인터 연산이 가능했었다. 이제 구조체에 대해서 알아봐야하는데, 이런 근본적인 형태의 차이로 인해서 구조체의 각 요소들에 접근하는 방식은 배열과 차이점이 생길 수 밖에 없게 된다. 그리고 배열에서는 요소라고 하지만, 구조체에서는 멤버변수라고 부른다. 아무튼 여러가지 측면에서 다른 양상을 보이는 두 자료구조는 비교대상이지만 따로 때어놓고 이해하는 것이 편리하다.

 

구조체의 선언

다음은 구조체를 선언한 코드다.

 

위 선언은 Test라는 태그를 생성한다. 이후로 Test로 구조체 변수를 생성할 수 있다.

struct Test first; //c언어

Test first; // c++

c보다 c++의 변수생성이 더욱 유연하다.

 

다음은 사용자 정의 타입으로 구조체를 선언한 경우다.

 

Test가 위 형태의 구조체를 대표하는 사용자 정의 타입으로 선언되었다.

동일한 구조체를 뜻하지만 typedef로 선언하는 것이 여러모로 유용하다.

사용자정의 타입도 일반적인 타입의 특성을 그대로 갖기 때문이다.

두가지 형태는 다 익혀놓고 사용은 typedef로 하길 권한다.



 

구조체의 멤버변수 접근

배열과 다르게 멤버변수의 크기가 제각각이기 때문에 구조체의 접근 방식은 멤버변수의 이름을 통해서 접근한다.

위 코드를 토대로 멤버변수에 접근을 해보자.

Test first;

first.num=10;

.을 사용해서 멤버변수에 접근할 수 있다. '.'은 멤버연산자인데, 이 멤버연산자의 작동은 offset, 즉 변위와 멤버변수의 타입을 통해서 멤버 변수에 접근한다. 각 구조체마다 고유의 '.'연산이 정해져있다.

offset값은 구조체의 멤버변수의 선언 순서와 관련이 있는데, 각 멤버변수는 순서대로 앞의 타입들의 크기의 합만큼의 offset을 가진다.

 

구조체 포인터에서 멤버변수의 접근

구조체도 타입이기 때문에, 포인터선언을 할 수 있다. 포인터를 통해 구조체의 멤버변수에 접근 하는 방법은 다음과 같다.

Test *first;

(*first).num=10; //포인터를 통한 멤버변수 접근

 

다음은 같은 표현이다.

first->num=10;

 

즉 (*first). 과 first-> 이 같다 (포인터멤버연산자)

 

간략하게 구조체를 알아봤는데 이 구조체는 c++에서 클래스의 근간이 된다.

반응형