22. 구조체와 사용자 정의 자료형1
I. 구조체란 무엇인가?
- 구조체 : 하나 이상의 변수를 그룹 지어서 새로운 자료형을 정의하는 것
- 구조체의 정의
- struct 구조체 이름
- {
- 멤버변수
- };
- 위와 같은 기본 형식이다.
- 구조체 변수의 선언
- struct 구조체 이름
- {
- 멤버변수
- } p1, p2, p3;
- 위와 같은 경우 밑의 그림처럼 생성이된다.
- 구조체의 정의와 구조체 변수의 선언의 분리
- struct 구조체 이름
- {
- 멤버변수
- };
- inr main()
- {
- struct p1,p2,p3;
- ...
- return 0;
- }
- 위의 같은 경우도 동시 선언했을때와 같은 형태이다.
- 구조체 변수로의 접근
- #include <stdio.h>
#include <math.h> - struct point
{
int x;
int y;
}; - int main()
{
struct point p1, p2; - double distance;
- fputs("첫 번째 점의 x,y 좌표 입력 : ",stdout);
scanf("%d %d",&p1.x,&p1.y); - fputs("두 번째 점의 x,y 좌표 입력 : ",stdout);
scanf("%d %d",&p2.x,&p2.y); - distance = sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
- printf("두 점의 거리는 %f입니다.\n",distance);
return 0;
}
- 위의 소스처럼 p1.x p1.y 이런 식으로 접근이 가능하다.
-
구조체 변수의 초기화
- 배열 초기화 문법을 구조체에 적용하기
- struct person
- {
- char name[20];
- char phone[20];
- int age;
- };
- inr main()
- {
- struct person p = {"kid","123-123",22};
- ...
- return 0;
- }
-
위와 같은 방법으로 초기화가 가능하다.
- 구조체 변수 멤버를 지정하여 초기화하기
- struct person
- {
- char name[20];
- char phone[20];
- int age;
- };
- inr main()
- {
- struct person p = {.age=22, .name="kid", .phone="123-123"};
- ...
- return 0;
- }
- 위와 같은 방법으로 멤버를 지정해서 초기화를 할수 있다.
II. 구조체와 배열 그리고 포인터
-
구조체와 배열
- 구조체 배열의 선언 및 접근
- struct person
- {
- char name[20];
- char phone[20];
- int age;
- };
- inr main()
- {
- struct person pArray[10];
- ...
- return 0;
- }
- 위의 소스는 구조체를 배열로 선언을 한것이다.
- #include <stdio.h>
- struct person
{
char name[20];
char phone[20];
};
int main()
{
struct person pArray[3];
int i;
for (i=0;i<3;i++)
{
printf("이름, 전화번호 : ");
scanf("%s %s",pArray[i].name,pArray[i].phone);
}
printf("\n 입력 결과는 다음과 같습니다.\n");
for (i =0;i<3;i++)
{
printf("이름 : %s, 전화번호 : %s\n",pArray[i].name, pArray[i].phone);
}
return 0;
}
-
위의 소스를 보면 구조체를 배열로 받아서 그 배열에 저장하고 출력하는 소스이다.
- 구조체 배열의 초기화
- struct person
- {
- char name[20];
- char phone[20];
- int age;
- };
- inr main()
- {
- struct person pArray[3]={
- {"a","111"},
- {"b","222"},
- {"c","333"}
- };
- ...
- return 0;
- }
- 위와 같은 방식으로 앞에서 배운 배열에서 초기화 하듯이 하면 된다.
-
구조체와 포인터
- 구조체 포인터를 선언하여 구조체 변수를 가리키는 경우
- 구조체의 멤버로 포인터 변수를 선언되는 경우
- 구조체 변수와 포인터
- #include <stdio.h>
- struct person
{
char name[20];
char phone[20];
};
int main()
{
struct person man = {"kid","123"};
struct person* pMan;
pMan = &man; - printf("name : %s\n",man.name);
printf("phone : %s\n",man.phone); - printf("name : %s\n",(*pMan).name);
printf("phone : %s\n",(*pMan).phone); - printf("name : %s\n",pMan->name);
printf("phone : %s\n",pMan->phone);
return 0;
}
-
pMan은 man의 주소값을 가지고 있다. 따라서 pMan 대신 &man을 넣어도 된다.
- *pMan.name == *(pMan.name)
- (*pMan).name == pMan->name
- 포인터 변수의 구조체 멤버
- #include <stdio.h>
- struct perInfo
{
char add[30];
char tel[30];
};
struct person
{
char name[20];
char pID[20];
struct perInfo* info;
}; - int main()
{
struct perInfo info = {"Korea Seoul","333-444"};
struct person man = {"Mr. Lee","123345-12341234"};
man.info = &info; - printf("name : %s\n",man.name);
printf("pID : %s\n",man.pID);
printf("addr : %s\n",man.info->add);
printf("tel : %s\n",man.info->tel); - return 0;
}
- 위의 소스의 결과값을 보고 어떻게 돌아가는지만 알면 된다.
- #include <stdio.h>
- struct person
{
char name[20];
char pID[20];
struct person* frnd;
}; - int main()
{
struct person man1 = {"Korea Seoul","333-444"};
struct person man2 = {"Mr. Lee","123345-12341234"};
man1.frnd = &man2; - printf("[Mr.Lee]\n");
printf("name : %s\n",man1.name);
printf("pID : %s\n",man1.pID); - printf("[His Friend]\n");
- printf("name : %s\n",man1.frnd->name);
printf("pID : %s\n",man1.frnd->pID);
return 0;
}
-
person이라는 구조체를 정의하는데, 구조체의 멤버로 person 구조체의 포인터 변수가 올 수 있다.
- 구조체 변수의 주소 값과 구조체 변수의 첫 번째 멤버의 주소 값
- #include <stdio.h>
- struct simple
{
int data1;
int data2;
}; - int main()
{
struct simple s = {1,2};
printf("address1 : %d\n",&s);
printf("address2 : %d\n",&(s.data1));
return 0;
}
- 구조체 변수의 주소값과 구조체 변수의 첫 번째 멤버의 주소 값은 같다.
이 글은 스프링노트에서 작성되었습니다.
'2. C/C++ > 01. C' 카테고리의 다른 글
24. 파일 입.출력 (0) | 2008.12.07 |
---|---|
23. 구조체와 사용자 정의 자료형2 (0) | 2008.12.07 |
21. 문자와 문자열 처리 함수 (0) | 2008.12.07 |
19. 함수포인터와 void 포인터 (0) | 2008.12.07 |
18. 다차원 배열 그리고 포인터 (0) | 2008.12.07 |