[열혈C프로그래밍] chapter 19. 구조체와 사용자 정의 자료형1
chapter 19
구조체와 사용자 정의 자료형1
구조체란?
- 구조체란 하나 이상의 변수(포인터 변수와 배열 포함)를 묶어서 새로운 자료형을 정의하는 도구
- 구조체란 기본 자료형이 아닌 사용자 정의 자료형(user defined data type)이다. 다른 걸로는 enum,union이 있다.
struct point // point 라는 이름의 구조체 정의
{
int xpos;// point 구조체를 구성하는 멤버 xpos
int ypos;// point 구조체를 구성하는 멤버 ypos
};
struct person //person이라는 이름의 구조체 정의
{
char* name; // 이름 저장을 위한 멤버 name.
char* phoneNum;// 폰 번호 저장을 위한 멤버 phonenum.
int age //나이 저장을 위한 멤버 age.
};
=> 구조체(struct)란 다른 자료형들을 담은 자료형으로, 담긴 자료형들은 구조체의 source와 같다.
- 구조체 변수의 선언
- 위의 point와 person이라는 구조체 type이 있다고 가정하였을때
struct point pos; //type이 point이고 이름이 pos인 구조체 변수.
struct person man; //type이 person이고 이름이 man인 구조체 변수.
구조체 변수의 멤버에 접근하기.
=> 구조체 변수의 이름.구조체 멤버의 이름으로 구조체변수의 멤버에 접근할 수 있다.
## include <stdio.h>
struct point{
int xpos;
int ypos;
};
int main(void){
struct point pos;
pos.xpos=10;
pos.ypos=20;
printf("%d \n",pos.xpos);
printf("%d \n",pos.ypos);
return 0;
}
구조체의 멤버에 접근할때
=> 구조체의 멤버로 배열이 선언되면 배열의 접근방식을 취하고, 구조체의 멤버로 포인터 변수가 선언되면 포인터 변수의 접근방식을 취하자
=> 선언된 멤버의 종류에 맞게 접근하자
구조체 변수의 초기화
## include <stdio.h>
struct point{
int xpos;
int ypos;
}; // 중괄호 닫고 세미콜론(;)을 붙여줘야 된다는 것을 잊지 말자.
int main(void){
struct point pos = {10,20}; //구조체 변수의 초기화
printf("%d %d\n", pos.xpos, pos.ypos);
return 0;
}
구조체와 배열 그리고 포인터
구조체 배열의 선언과 접근
struct point{
int xpos;
int ypos;
};
struct point pos[3]; // 구조체 배열
=> pos는 다음과 같은 구조로 할당된다.
arr[0] | arr[1] | arr[2] |
---|---|---|
int xpos | int xpos | int xpos |
int ypos | int ypos | int ypos |
구조체 배열의 초기화
struct person arr[3]={
{"이승기", "010-0000-0000", 21},// 첫번째 요소의 초기화
{"김도형","010-2297-5762",27}, // 두번째 요소의 초기화
{"장지윤","010-9330-1994",26} //세번째 요소의 초기화
};
구조체 변수와 포인터
struct point pos = {11,12}; //구조체 변수의 초기화
struct point *sptr = &pos; // 포인터 변수 sptr이 구조체변수 pos를 가리킨다.
(*sptr).xpos = 10; //포인터로 변수에 접근해 멤버의 변수값 할당하기.
(*sptr).ypos = 20;
sptr->xpos = 10;//포인터로 변수에 접근해 멤버의 변수값 할당하기.
sptr->ypos = 20;
// ->가 편리하므로 사람들은 모두 ->을 사용한다.
// ->을 쓰도록하자.
=> 이런 식으로 구조체형 포인터 변수를 선언하면 된다.
- 구조체 변수의 주소 값은 구조체 변수의 첫번째 멤버의 주소값과 동일하다.
## include <stdio.h>
struct point{
int xpos;
int ypos;
};
int main(void){
struct point pos ={1,2};
printf("%p\n",&pos); //0x7fff77f4d500
printf("%p\n",&pos.xpos);//0x7fff77f4d500
printf("%p\n",&pos.ypos);//0x7fff77f4d504
//=> 구조체 변수의 주소값과 첫번째 멤버의 주소값이 같음을 알수 있다.
return 0;
}