wEb

[C] 구조체(Structure)

dd2i 2012. 12. 20. 11:24
반응형

구조체(Structure)

C에서 가장 큰 데이터 타입.

정수나 실수 또는 문자열 등의 단순한 형태로 나타낼 수 없는 복잡한 데이터를 표현 할 때 사용.

"타입이 다른 변수들의 집합(이종변수 집합)"

=> 관련성 있는 여러정보를 하나의 완성된 정보로 구성.


 배열  http://dondon2i.tistory.com/57  구조체
  • 타입이 같은 변수들의 집합.
  • 배열 선언 형식

type 배열명 [크기] [크기]... ;

  • type: 정수형, 실수형 등의 기본형 외에도 포인터, 구조체, 사용자 정의형 등 임의의 타입이 모두 배열 구성 가능.
  • 배열명: 관습적으로 ar이나 a같은 접두어를 사용.
  • 크기: 배열의 요소 개수. 즉, 몇 개의 변수가 모여서 배열을 구성하는지를 지정하는데 자연수로 된 상수로 표기.
  • 연결 리스트, 스택, 큐, 트리 같은 자료구조들 중에 가장 단순하고, 사용 빈도가 높음.
  • 다른 자료 구조에 비해 낭비되는 메모리가 없음.
  • 배열 요소들이 연속적인 공간에 배치되므로 요소를 참조하는 속도가 빠름.
  • 하지만, 반드시 연속적이어야 하므로 새로운 요소를 삽입하거나 기존요소를 삭제하는 속도가 느림.
*배열요소(Element): 배열을 구성하는 각각의 개별 변수들.
  • 다른 타입을 가지는 변수들의 집합.
  • 구조체 선언 형식

struct {

멤버(member)목록

} ;

  • 태그를 먼저 정의하고 이 태그로 구조체 변수를 선언하는 것이 더 일반적.

struct  태그명 {

멤버목록

} ;

  • 구조체 태그명은 관습적으로 tag_라는 접두어를 붙이는 경우가 많음.
  • 구조체 멤버 타입은 제한 없음.
  • 멤버의 개수도 제한 없음.
  • 구조체 선언은 구조체의 모양을 컴파일러에게 알리는 것뿐이므로 static, register 같은 기억부류를 지정하거나 초기값 줄 수 없음.
  • 같은 타입의 변수들도 하나의 구조체로 묶을 수 있음.
  • 멤버를 하나만 가지는 구조체 선언도 가능.


구조체멤버들은 크기가 제각각이므로 배열처럼 단순한 곱셈으로 멤버의 위치를 찾을 수 없음.

따라서. 오프셋을 더해 멤버를 읽음.


오프셋(offset) ; 구조체 시작번지로부터 멤버까지의 거리. 자기보다 앞에 있는 멤버들의 크기의 총합과 같음.


구조체변수 = 멤버들의 집합.


구조체가 선언될 때, 컴파일러는 각 멤버의 오프셋과 타입을 기억.

멤버는 구조체에 소속되어 있을 뿐, 일반 변수와 완전히 같은 자격을 지님.

구조체 멤버의 통용범위 = 구조체 내부로 국한. 구조체 없이 홀로 사용 불가. 멤버를 참조할 때는 반드시 소속 필요.

그래서 멤버를 참조할 때 소속이 다르면 멤버의 이름이 같아도 무관.



 배열 참조할 때 http://dondon2i.tistory.com/57  구조체의 멤버를 읽을 때
  • [ ] 연산자와 첨자를 사용.
    int ar[5] ;
    ar[3]=1 ;
  • 배열을 구성하는 모든 요소의 크기가 일정하고 서로 인접해있으므로 참조방식이 단순.
  • 멤버연산자( . 모양이 마침표와 같음)를 사용.
  • 구조체명.멤버명 형식으로 사용.
    Friend . Age // Friend구조체의 Age멤버값을 읽겠다.
  • 구조체의 멤버는 타입과 크기가 다름.
    따라서 순서값 사용불가. 별도의 연산자와 멤버의 이름 사용.


초기값을 준다 = 초기화한다 = 메모리를 채운다.


 일반변수 초기화  배열 초기화    구조체 초기화

type 변수명 = 초기화값 ;
int i=3;
변수명 다음에 = 기호(구두점)를 쓰고 초기값을 지정

  • 단일값으로 초기화하므로 굳이 { }괄호가 필요 없음.

type 배열명 [크기] = {초기화 값들};

int ar[5]={4,8,3,69,-7};

  • 값의 묶음을 한꺼번에 전달해야하므로 초기식에 { }괄호와 각 초기값들 사이에 콤마(,)사용
  • 배열은 여러 개의 값을 나열해야 하므로 { } 괄호를 생략불가

구조체선언_구조체명 = {멤버의초기화값들} ;
 tag_Friend Friend={"장달상", 30, 178.2 };

  • 초기화방법이 배열과 거의 비슷.
  • 구분자와 { }괄호를 쓰고 괄호안에 멤버의 초기값 나열.



구조체배열.

구조체를 구성하는 멤버는 타입이 모두 다르지만 배열을 구성하는 요소는 모두 구조체라는 같은 타입이므로 배열이 될 수 있음.


->  //포인터멤버연산자 =화살표연산자(Arrow Operator) = arrow


좌변        우변

구조체포인터 -> 멤버이름  // '~번지의 구조체 멤버~'


(*p).m = p -> m  //P가 구조체를 가리키는 포인터이고 m이 멤버일 때,


중첩구조체 = 다른 구조체를 멤버로 포함하는 구조체.

자기 자신을 멤버로 포함할 수는 없지만 자신과 같은 타입의 구조체에 대한 포인터를 멤버로 가지는 것은 가능.



반응형