구조체의 정의
구조체는 하나 이상의 변수( 포인터변수와 배열 포함) 을 묶어서 새로운 자료형을 정의하는 도구이다. 두가지 이상의 변수가 함께있을때만 의미를 지닐때, 이 변수들을 묶어서 표현하기위해 등장한 것이 구조체이다.
구조체의 선언
struct point // point 라는 이름의 구조체 정의
{
int xpos;
int ypos; // point 구조체를 구성하는 멤버
};
struct person
{
char name[20];
char phoneNum[20];
int age;
};
이때 point는 int 와 double 과 같은 자료형의 이름이 된다. 이렇게 기본 자료형 변수를 묶어서 새로운 자료형을 만든것을 사용자 정의 자료형(user defined data type) 라고 한다.
구조체 변수의 선언과 접근
struct type_name val_name
ex ) struct point pos;
접근방식은 구조체변수의이름.구조체멤버의이름 이다.
ex) pos.xpos =1;
구조체 변수의 초기화
struct point pos ={10,20};
struct person man={"이승기","010-1212-0001",21}; // 선언과 동시에 초기화할때는 문자열 저장을위해 strcpy 함수를 호출하지않아도된다.
구조체 배열의 선언과 접근
struct point arr[4]; // 구조체 배열의 선언
arr[i].xpos; // 구조체 배열의 접근
구조체 배열의 초기화
struct person arr[3]={
{"이승기","010-1212-0001",21},
{"정지영","010-1313-0002",22},
{"한지수","010-1717-0003",19}
};
구조체 변수와 포인터
struct point * pptr =&pos; //포인터 변수 pptr이 구조체변수 pos를 가리킴
(*pptr).xpos =10; // 포인터 변수 pptr 을 이용해서 pos의 멤버에 접근
pptr->xpos =10; // 위와 동일한 문장이다.
포인터변수를 구조체의 멤버로 선언
struct circle
{
double radius;
struct point * center;
};
int main(void)
{
struct point cen={2,7};
double rad =5.5;
struct circle ring={rad,&cen};
printf"원의 중심 : [%d,%d]",(ring.center)->xpos,(ring.center)->ypos);
}
TYPE형 구조체 변수의 멤버로 TYPE형 포인터 변수를 둘 수 있다.
struct point
{
int xpos;
int ypos;
struct point * ptr; // 구조체 point 의 포인터변수 선언
}
* 구조체 변수의 주소값은 구조체 변수의 첫번째 멤버의 주소값과 동일하다.
typedef 선언
typedef 선언을 추가하면 구조체변수를 선언할때 , struct 키워드를 생략할 수 있다.
typedef선언은 기존에 존재하는 자료형의 이름에 새 이름을 부여하는것을 목적으로 하는 선언이다.
ex) typedef int INT // 자료형의 이름 int에 INT라는 새로운 이름을 부여한다.
INT num; // int num; 과 동일한선언
typedef name1 name2 name3 일때 , name3가 새로운 이름이된다.
ex) typedef unsigned int * PTR_UINT // PTR_UINT num; 과 unsigned int * num; 은 동일한 선언이다.
typedef로 정의되는 자료형의 이름은 대문자로 시작하는것이 관례이다.
구조체의 정의와 typedef 선언
typedef struct point // point는 Point 를 선언했을때 생략가능하다
{
int xpos;
int ypos;
}Point; // struct point 형의 새로운 자료형이름 Point
Point pos;
함수로의 구조체변수 전달과 반환
void ShowPosition ( Point pos ) // 인자로 Point 형 구조체변수 전달
{
printf( "[%d,%d] \n",pos.xpos,pos.ypos)
}
Point GetCurrentPosition(void)
{
Point cen;
scanf("%d %d",&cen.xpos,&cen.ypos);
return cen;
}
'C언어 > 열혈C' 카테고리의 다른 글
C : Chapter -20 파일 입출력 (0) | 2018.03.31 |
---|---|
C : Chapter -19 공용체와 열거형 (0) | 2018.03.30 |
C : Chapter-17 문자와 문자열 관련 함수 (0) | 2018.03.27 |
C : Chapter -16 함수 포인터와 void 포인터 (0) | 2018.03.25 |
C : Chapter -15 다차원 배열과 포인터 (0) | 2018.03.25 |