구조체

|
#사용자 정의 자료형 (typedef)
새로운 자료형을 정의하는데 사용한다.
긴 이름의 자료형을 짧게 정의할 수 있다. 

정의 예)
typedef unsigned char BYTE;
typedef unsigned WORD;
typedef int VECTOR[3];
크기가 3인 int형 배열을 VECTOR라는 자료형으로 정의
typedef char* STRNIG;
문자를 가리키는 포인터형을 STRING이라는 자료형으로 정의

선언 예)
BYTE ch;
WORD aword;
VECTOR matrix3;
크기가 3인 int형 배열 matrix3을 선언하였다. 총 12바이트의 메모리 공간을 차지한다.
STRING aString;
char형 포인터 변수 aString을 선언하였다. 포인터 변수이므로 4바이트의 메모리 공간을 차지한다.


#구조체
배열 :
의미상 서로 연관된 자료형이 동일한 자료들을 하나의 이름으로 묶은 것이다.
각각의 요소를 접근하기 위해서는 배열이름[index]를 사용한다.

구조체 :
의미상 서로 연관이 되지만 자료형이 서로 다른 자료들을 하나의 이름으로 묶은 것이다.
각각의 요소를 접근하기 위해서는 구조체 변수이름.멤버이름를 사용한다.

구조체와 배열을 서로 중첩하여 정의할 수 있어 복잡한 구조의 자료를 효울적으로 구성할 수 있다.

1) 구조체의 원형을 정의한 후, 변수를 선언하는 방법 (태그 있음)
struct student {
    char name[20];
    int english;
    int math;
};

struct student st1;
struct student st2;
구조체 변수 st1, st2가 만들어졌다.

2) 구조체의 원형과 변수의 선언을 동시에 하는 방법 (태그 있음)
struct student {
    char name[20];
    int english;
    int math;
} st1;
struct student st2;
구조체 변수 st1, st2가 만들어졌다.

3) 구조체의 원형을 정의한 후, 단 한 번만 변수로 사용하는 방법 (태그 없음)
struct {
    char name[20];
    int english;
    int math;
} st1;
구조체 변수 st1은 만들어졌으나 struct 뒤에 태그가 없어 Noname Type이 되어 st2를 만들 수 없다.
만드려면 아래와 같은 방법이 있다.
struct {
    char name[20];
    int english;
    int math;
} st1, st2;

struct {
    char name[20];
    int english;
    int math;
} st1;
struct {
    char name[20];
    int english;
    int math;
} st2;


4) typedef을 이용하여 구조체의 자료형을 새로운 자료형으로 정의하는 방법 (struct를 생략할 수 있음, 가장 많이 사용)
typedef struct _student {
    char name[20];
    int english;
    int math;
} student;
student st1;


#구조체의 초기화
typedef struct {
    int x;
    int y;
} POINTER;
POINTER p1 = { 0, 0 };
POINTER p2 = { 0, 0 };
초기값이 구조체 멤버의 자료형과 일치해야 한다.

배열은 복사가 불가능하지만 구조체는 복사가 가능하다. 따라서 다음과 같이 할 수 있다.
POINTER p1 = { 0, 0 };
p2 = p1;


#구조체 배열
일반적으로 구조체는 구조체 배열이나 연결리스트의 노드로 많이 사용된다.
typedef struct {
    char name[15];
    char countryp20];
    int age;
} STUDENT;

STUDENT st[5];


#구조체 포인터
구조체 변수의 시작주소를 값으로 저장한다. 
typedef struct {
    char name[15];
    char country[20];
    int age;
} STUDENT;

STUDENT *sp;

구조체 멤버 접근 방법
1) (*sp).name = "Jack";
2) sp->name = "Jack";
2)의 방법을 많이 쓴다.


#구조체와 함수
1) 구조체 변수의 멤버를 함수의 인수로 전달하는 경우
인수의 갯수가 많아진다.

2) 구조체 변수를 함수의 인수로 전달하는 경우
구조체 변수 전체의 값이 전달되므로 구조체의 용량이 큰 경우 좋지 않다.

3) 구조체 변수의 주소를 인수로 전달하는 경우
인수의 갯수도 많지 않으며, 값이 아닌 시작주소만 전달되므로 인수 1개당 4바이트만 차지한다.


#구조체 변수는 복사가 가능하고 배열은 복사가 불가능한 이유
구조체는 변수이므로 메모리 공간을 의미한다. 따라서 '메모리 공간 = 메모리 공간'이 되어 대입이 가능하다.
반면에 배열은 이름 자체가 배열의 시작주소를 의미한다. 따라서 '주소 = 주소'가 되어 대입이 불가능하다.
따라서 for문을 이용하여 복사한다. 단, 문자 배열인 경우는 strcpy()를 사용할 수 있다.


#구조체 사이즈 출력
구조체에 멤버를 선언하면 4바이트보다 작은 멤버는 같이 묶여 4바이트 내에 할당된다.
char, char, short --> 4바이트
short, char, char --> 4바이트
char, short, char --> 8바이트



구조체 자체는 새로 정의한 타입 자체이므로 구조체 타입으로 만든 변수가 아닌 구조체 자체는 메모리에 할당되지도 않으며, 따라서 값 자체를 가지지 못한다.





















'C' 카테고리의 다른 글

포인터 상수  (0) 2010.06.24
문자열  (0) 2010.06.13
버블 정렬 c 0609  (0) 2010.06.09
다중포인터  (0) 2010.06.08
16진수 0xffffffff의 값 (signed and unsigned)  (0) 2010.06.06
And