[열혈C프로그래밍] chapter 19. 구조체와 사용자 정의 자료형1

chapter 19

구조체와 사용자 정의 자료형1

구조체란?

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;
}