여러 사람의 정보를 저장한다고 가정하면 다수의 구조체 변수를 선언해야 함
구조체 배열의 선언과 접근
다수의 int형 변수를 선언할 때 int형 배열의 선언을 고려하듯이,
다수의 구조체 변수를 선언할 때에는 구조체 배열의 선언을 고려해야 한다.
구조체 배열의 선언방법은 일반적인 배열의 선언 방법과 동일
int형 변수의 선언과 int형 배열선언의 관계과 다음과 같듯이,
int형 변수 : int num
int형 배열 : int arr[10]
point형 구조체 변수 선언과 point형 배열 선언은 아래와 같다
point형 변수 : struct point pos
point형 배열 : struct point arr[10]
다음의 구조로 배열이 할당
예제
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct point
{
int xpos;
int ypos;
};
int main(void)
{
struct point arr[3];
for (int i = 0; i < 3; i++)
{
printf("점의 좌표 입력: ");
scanf("%d %d", &arr[i].xpos, &arr[i].ypos);
}
for (int i = 0; i < 3; i++)
printf("[%d, %d] ", arr[i].xpos, arr[i].ypos);
}
구조체 배열의 초기화
구조체 변수를 선언과 동시에 초기화할 때에는 다음과 같이 중괄호를 통해서 초기화할 값을 명시한다.
struct person man={"하이맨", "010-1234-5678", 21}
구조체 배열을 선언과 동시에 초기화할 때는 다음과 같이 배열의 길이만큼 중괄호를 이용해서 초기화를 진행
struct person arr[3] =
{
{"하이맨", "010-1234-5678", 21}, // 첫 번째 요소의 초기화
{"하이우먼", "010-8765-4321", 22}, // 두 번째 요소의 초기화
{"하이독", "010-1111-2222", 3} // 세 번째 요소의 초기화
};
예제
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct person
{
char name[20];
char phonenum[20];
int age;
};
int main(void)
{
struct person arr[3] =
{
{"하이맨", "010-1234-5678", 21}, // 첫 번째 요소의 초기화
{"하이우먼", "010-8765-4321", 22}, // 두 번째 요소의 초기화
{"하이독", "010-1111-2222", 3} // 세 번째 요소의 초기화
};
for (int i = 0; i < 3; i++)
printf("%s %s %d \n", arr[i].name, arr[i].phonenum, arr[i].age);
}
구조체 변수와 포인터
구조체 배열의 선언 및 접근의 방법이 일반적인 배열의 선언 및 접근의 방법이 다르지 않듯이,
구조체 포인터 변수의 선언 및 연산의 방법도 일반적인 포인터 변수의 선언 및 연산의 방법과 다르지 않다.
int형 포인터 변수 선언 및 초기화
int num = 10;
int *iptr = #
point형 구조체의 포인터 변수도 다음과 같이 선언 및 초기화
struct point pos = {11, 12}; // xpos, ypos를 각각 11, 12로 초기화
struct point* pptr = &pos; // 포인터 변수 pptr이 구조체 변수 pos를 가리킴
그리고 int형 포인터 변수 iptr을 이용해서 다음과 같이 변수 num에 접근하듯이,
*iptr=20;
위의 point형 포인터 변수 pptr을 이용해서 다음과 같이 구조체 변수 pos에 접근 가능
(*pptr).xpos=10; // pptr이 가리키는 구조체 변수의 멤버 xpos에 10 저장
(*pptr).ypos=20; // pptr이 가리키는 구조체 변수의 멤버 ypos에 20 저장
접근을 위해서 포인터 변수를 대상으로 * 연산을 하는 것은 동일
다만 구조체 포인터 변수의 경우 접근하고자 하는 멤버의 선택을 위해 . 연산을 추가
그리고 두 문장은 다음과 같이 쓸 수 있다.
pptr->xpos=10; // pptr이 가리키는 구조체 변수의 멤버 xpos에 10 저장
pptr->ypos=20; // pptr이 가리키는 구조체 변수의 멤버 ypos에 20 저장
즉 *연산과 .연산을 하나의 -> 연산으로 대신할 수 있다는 것. 의미는 동일
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct point
{
int xpos;
int ypos;
};
int main(void)
{
struct point pos1 = { 1, 2 };
struct point pos2 = { 100, 200 };
struct point* pptr = &pos1;
(*pptr).xpos += 4;
(*pptr).ypos += 5;
printf("[%d, %d] \n", pptr->xpos, pptr->ypos);
pptr = &pos2; // 구조체 포인터가 pos1에서 pos2를 가리키게 함
pptr->xpos += 1;
pptr->ypos += 2;
printf("[%d, %d] \n", (*pptr).xpos, (*pptr).ypos);
}
-> 연산자가 익숙해지면 간결하고 가독성도 높일 수 있음
포인터 변수를 구조체의 멤버로 선언하기
배열이 구조체의 멤버로 선언될 수 있듯이, 포인터 변수도 구조체의 멤버가 될 수 있다.
예제
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
/* 구조체 정의*/
struct point
{
int xpos;
int ypos;
};
/* 구조체 정의*/
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("원의 반지름 : %g \n", ring.radius);
printf("원의 중심 [%d, %d] \n", (ring.center)->xpos, (ring.center)->ypos);
}
"TYPE형 구조체 변수의 멤버로 TYPE형 포인터 변수를 둘 수 있다."
struct point
{
int xpos;
int ypos;
struct point* ptr; // 구조체 point의 포인터 변수 선언
}
예제
삼각형을 이루는 세 점의 연결관계도 표현
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
/* 구조체 정의*/
struct point
{
int xpos;
int ypos;
struct point* ptr; // 구조체 point의 포인터 변수 선언
};
int main(void)
{
/* 구조체 변수 선언 및 초기화 */
struct point pos1 = { 1, 1 };
struct point pos2 = { 2, 2 };
struct point pos3 = { 3, 3 };
pos1.ptr = &pos2; // pos1과 pos2를 연결
pos2.ptr = &pos3; // pos2과 pos3를 연결
pos3.ptr = &pos1; // pos3과 pos1를 연결
printf("점의 연결관계....\n");
printf("[%d %d]와(과) [%d %d] 연결 \n", pos1.xpos, pos1.ypos, pos1.ptr->xpos, pos1.ptr->ypos);
printf("[%d %d]와(과) [%d %d] 연결 \n", pos2.xpos, pos2.ypos, pos2.ptr->xpos, pos2.ptr->ypos);
printf("[%d %d]와(과) [%d %d] 연결 \n", pos3.xpos, pos3.ypos, pos3.ptr->xpos, pos3.ptr->ypos);
return 0;
}
위와 같은 형태의 구조체 정의는 다양한 데이터의 표현에서 흔히 사용.
특히 자료구조라는 과목을 공부하다 보면 이러한 유형의 구조체 정의를 발견
구조체 변수의 주소 값과 첫 번째 멤버의 주소 값
"구조체 변수의 주소 값은 구조체 변수의 첫 번째 멤버의 주소 값과 동일하다"
예제
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
/* 구조체 정의*/
struct point
{
int xpos;
int ypos;
};
struct person
{
char name[20];
char phonenum[20];
int age;
};
int main(void)
{
struct point pos = { 10, 20 };
struct person man = { "하이맨", "010-1234-5678", 150 };
printf("%p %p \n", &pos, &pos.xpos);
printf("%p %p \n", &man, &man.name);
return 0;
}
위 예제에서 보이는 구조체 변수의 주소 값과 관련된 특징을 지금 당장 활용할 일은 없으나
다양한 분야에서 소프트웨어를 개발하다 보면, 이러한 특징을 활용해서 프로그래밍해야 할 수도 있다.
참고 : [윤성우 열혈 C 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.
'Language&Framework&Etc > C' 카테고리의 다른 글
구조체와 사용자 정의 자료형2(23-2) 함수로의 구조체 변수 전달과 반환 (0) | 2020.12.13 |
---|---|
구조체와 사용자 정의 자료형2(23-1) 구조체의 정의와 typedef 선언 (0) | 2020.12.13 |
구조체와 사용자 정의 자료형1(22-1) 구조체란 무엇인가 (0) | 2020.12.11 |
문자와 문자열 관련 함수(21-5) 입출력 이외의 문자열 관련 함수 (0) | 2020.12.11 |
문자와 문자열 관련 함수(21-4) 표준 입출력과 버퍼 (0) | 2020.12.11 |