구조체 : 하나 이상의 변수(포인터 변수와 배열 포함)를 묶어서 새로운 자료형을 정의하는 도구, 사용자가 새로운 자료형 정의 가능
구조체 변수의 선언
struct type_name val_name
구조체 변수 선언시 위처럼 struct선언을 추가해야 하며, 이어서 구조체 이름, 구조체 변수 이름을 선언해야 한다.
구조체 내부에 있는 변수 접근시
구조체 변수의 이름(val_name).구조체 멤버 이름
구조체 선언 방법
struct point // 구조체 정의와 변수의 선언, 여기서 point는 int나 double처럼 자료형의 이름이 된다
{
int xpos;
int ypos;
} pos1, pos2, pos3; 이런 식으로 구조체를 정의함과 동시에 구조체 변수를 선언할 수도 있고
struct point // 구조체의 정의, 여기서 point는 int나 double처럼 자료형의 이름이 된다
{
int xpos;
int ypos;
};
struct point pos1, pos2, pos3; // 구조체 변수의 선언
구조체 배열
ex) struct point arr[3]; 이런 식으로 구조체 배열 선언
구조체 배열을 선언과 동시에 초기화 시 배열의 길이만큼 중괄호를 이용해서 초기화를 진행
ex) struct person arr[3]={
{"blair","290490"},{"Alice","39848"},{"Ryan","57839"} };
구조체 변수와 포인터
ex) struct point pos={11,12};
struct point * pptr = &pos; // 포인터 변수 pptr이 구조체 변수 pos를 가리킨다.
(*pptr).xpos = 10; // pptr이 가리키는 구조체 변수의 멤버 xpos에 10 저장
(*pptr).ypos = 20;
(*pptr).xpos = 10 이 문장은 pptr -> xpos = 10; 이 문장과 동일하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> struct point { int xpos; int ypos; }; struct circle { double radius; struct point * center; }; int main() { struct point cen = {2,7}; double rad = 5.5; struct circle ring = {rad, &cen}; printf("Center Circle is [%d, %d]\n", (ring.center)->xpos, (ring.center)->ypos); } | cs |
위 코드에서 보면 circle 구조체 안에 구조체 포인터 center을 선언해놓고, 나중에 point형 구조체를 초기화 하면서 구조체의 주소값을 ring 구조체에 넘겨주었다. 즉, ring.center가 가리키는 값은 point형 구조체 cen이다.
*추가* TYPE형 구조체 변수의 멤버로 TYPE형 포인터 변수를 둘 수 있다.
구조체 변수의 조소 값과 첫 번째 멤버의 주소 값
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <stdio.h> struct point { int xpos; int ypos; }; struct person { int name[1]; int phoneNum[1]; int age; }; int main() { struct point pos={10,20}; struct person man={1,1,21}; printf("%p\n%p\n%p\n%p\n",&man, &man.name,&man.phoneNum,&man.age); } | cs |
코드 결과값
그냥 우리가 익히 아는 주소값 개념 그대로 적용된다. 만약 int name[1]대신에 char name[20]이면 주소값이 20차이가 남
typedef 선언
typedef : 기존에 존재하는 자료형의 이름에 새 이름을 부여하는 것을 목적으로 하는 선언
ex) typedef unsigned int * PTR_UINT; // unsigned int형 pointer을 PTR_UINT로 선언
구조체 배열의 초기화
struct person arr[2]={
{"김개똥","1234-1234",24},{"홍길동","1234-4234",28}
};
구조체 포인터
struct point pos = {11, 12};
struct point *pptr = &pos;
(*pptr).xpos = 10; or pptr->xpos=10; (*연산과 . 연산을 -> 연산으로 대신)
typedef 선언
기존에 존재하는 자료형의 이름에 새 이름을 부여하는 것
ex) typedef int INT; //int의 또 다른 이름 INT를 부여
typedef struct (point)<< 구조체 변수 이름인 point는 생략가능
{
int xpos;
int ypos;
} Point;
그리고 이렇게 되면 구조체 변수 이름인 point는 거의 쓰이지 않아서 생략이 가능하다. 다만 생략할 경우 struct point man; 이런 식으로 선언 못함
구조체도 call by reference가 가능하다.
typedef struct point
{
~~~~
} Point;
void OrgSymTrans(Point * ptr)
{
~~~~
}
int main() {
Point pos={7,-5};
OrgSymTrans(&pos);
}