구조체 포인터 사용하기
C 언어에서 구조체는 다양한 데이터 타입을 하나의 논리적 단위로 묶는데 사용됩니다. 구조체 포인터는 구조체 변수를 가리키는 포인터 변수를 사용하여 구조체의 멤버에 접근하는 방법을 제공합니다. 이번 아티클에서는 구조체 포인터를 사용하여 좌표를 입력받고 출력하는 예제를 소개합니다.
먼저, 구조체를 정의하려면 typedef struct
를 사용하여 구조체 타입을 선언해야 합니다. 이 예제에서는 Point
라는 구조체 타입을 정의하고, x
와 y
라는 int형 멤버 변수를 포함시킵니다.
typedef struct
{
int x;
int y;
} Point;
그 다음, main
함수에서 Point
구조체 타입의 변수 p1
을 선언합니다. 이렇게 하면 p1
변수에 좌표를 저장할 수 있습니다.
Point p1;
이제 Point
구조체를 가리키는 포인터 변수 ptr
를 선언하고, p1
변수의 주소를 할당합니다. 이렇게 하면 ptr
을 사용하여 p1
의 멤버 변수에 접근할 수 있습니다.
Point* ptr = &p1;
이후, 사용자로부터 좌표를 입력받기 위해 printf
와 scanf
함수를 사용합니다. 여기서는 구조체 포인터를 사용하여 멤버 변수에 접근하므로, ptr->x
와 ptr->y
형태를 사용해야 합니다.
printf("점의 좌표를 입력하세요 (x, y): ");
scanf("%d %d", &ptr->x, &ptr->y);
마지막으로, 입력받은 좌표를 출력하기 위해 printf
함수를 사용하고, 다시 구조체 포인터를 사용하여 멤버 변수에 접근합니다.
printf("입력한 점의 좌표: (%d, %d)\n", ptr->x, ptr->y);
전체 프로그램 소스는 다음과 같습니다.
코드: using_struct_pointer.c
#define _CRT_SECURE_NO_WARNINGS // 경고를 무시하는 매크로 정의
#include <stdio.h>
// Point 구조체 정의
typedef struct
{
int x; // x 좌표
int y; // y 좌표
} Point;
int main(void)
{
Point p1; // Point 구조체 변수 선언
Point* ptr = &p1; // Point 구조체를 가리키는 포인터 변수 선언 및 p1의 주소 할당
// 사용자로부터 점의 좌표를 입력받음
printf("점의 좌표를 입력하세요 (x, y): ");
scanf("%d %d", &ptr->x, &ptr->y);
// 입력받은 좌표를 출력
printf("입력한 점의 좌표: (%d, %d)\n", ptr->x, ptr->y);
return 0;
}
점의 좌표를 입력하세요 (x, y): 10 20
입력한 점의 좌표: (10, 20)
이처럼 구조체 포인터를 사용하면, 구조체의 멤버 변수에 간편하게 접근할 수 있습니다. 이 기능을 활용하면 더 복잡한 구조체를 다루는 프로그램도 쉽게 작성할 수 있습니다.
구조체 포인터를 사용하여 프로그램을 작성하는 것은 좋은 프로그래밍 습관이며 다음과 같은 장점이 있습니다.
메모리 절약: 구조체 포인터를 사용하면, 구조체 변수를 직접 전달하는 것보다 메모리 사용량이 줄어듭니다. 이는 특히 큰 구조체를 다루거나 함수 간에 구조체를 전달할 때 효율적입니다.
간접 참조: 구조체 포인터를 사용하면, 구조체의 멤버 변수에 간접적으로 접근할 수 있습니다. 이를 통해, 함수 내에서 구조체의 내용을 수정할 수 있으며 다양한 프로그래밍 기법을 구현할 수 있습니다.
코드의 가독성 향상: 구조체 포인터를 사용하면, 코드의 가독성이 향상되며 유지 관리가 용이해집니다. 이는 코드를 작성하거나 디버깅할 때 시간을 절약할 수 있습니다.
예를 들어, 두 점 사이의 거리를 계산하는 함수를 구조체 포인터를 사용하여 작성할 수 있습니다.
코드: distance_between_points.c
#include <stdio.h>
#include <math.h>
// Point 구조체 정의
typedef struct
{
int x; // x 좌표
int y; // y 좌표
} Point;
// 두 점 사이의 거리를 계산하는 함수
// 입력: 두 개의 Point 구조체 포인터
// 출력: 두 점 사이의 거리 (double)
double calculate_distance(Point* p1, Point* p2)
{
int dx = p1->x - p2->x; // x 좌표의 차이 계산
int dy = p1->y - p2->y; // y 좌표의 차이 계산
// 두 점 사이의 거리를 계산하여 반환
return sqrt((double)(dx * dx + dy * dy));
}
int main(void)
{
// 두 개의 Point 구조체 변수를 선언하고 초기화
Point p1 = { 10, 20 };
Point p2 = { 30, 40 };
// calculate_distance 함수를 호출하여 두 점 사이의 거리를 계산
double distance = calculate_distance(&p1, &p2);
// 계산된 거리를 출력
printf("두 점 사이의 거리: %.2lf\n", distance);
return 0;
}
두 점 사이의 거리: 28.28
위 코드는 두 점의 좌표를 구조체로 저장하고, 구조체 포인터를 사용하여 거리를 계산하는 함수를 작성한 예제입니다. 이를 통해 구조체 포인터를 활용하는 프로그래밍 기법을 적용할 수 있습니다.
결론적으로, 구조체 포인터를 사용하면 메모리 사용량을 줄이고 코드의 가독성을 향상시킬 수 있습니다. 또한, 구조체 포인터를 사용하여 다양한 프로그래밍 기법을 구현할 수 있어, 복잡한 구조체를 다루는 프로그램 작성이 용이해집니다.
문제 풀이
정보처리기능사 실기 문제: 구조체 배열과 포인터를 활용한 정보 출력
이 문제에서는 C 언어를 사용하여 구조체 배열을 정의하고, 포인터를 이용해 배열의 특정 요소에 접근하여 정보를 출력하는 프로그램을 작성하는 것이 목표입니다. 이 과정에서 구조체의 정의 및 초기화, 그리고 구조체 포인터의 사용법에 대해 이해해야 합니다.
문제: insa
라는 구조체가 있습니다. 이 구조체는 두 멤버, 문자열 name
과 정수 age
를 가지고 있습니다. 구조체 배열 a
를 초기화하여 네 명의 인사 정보를 저장한 후, 배열의 두 번째 요소의 name
과 age
를 출력하는 C 프로그램을 작성하시오.
#include <stdio.h>
main() {
struct insa {
char name[10];
int age;
} a[] = { {"Kim", 28}, {"Lee", 38}, {"Park", 42}, {"Choi", 31} };
struct insa* p;
p = a;
p++; // 포인터를 이용해 배열의 두 번째 요소로 이동
// 두 번째 요소의 name과 age 출력
printf("%s\n", p->name);
printf("%d\n", p->age);
}
해결 방법:
#include <stdio.h>
를 사용하여 표준 입출력 라이브러리를 포함합니다.insa
라는 이름의 구조체를 정의합니다. 이 구조체는 문자 배열name
과 정수age
를 멤버로 가집니다.insa
구조체 타입의 배열a
를 선언하고, 초기화하여 네 명의 인사 정보를 저장합니다.insa
구조체를 가리킬 포인터p
를 선언하고, 배열a
의 첫 번째 요소를 가리키도록 합니다.- 포인터
p
를 사용하여 배열의 두 번째 요소로 이동합니다(p++
). - 포인터
p
를 통해 접근한 배열의 두 번째 요소의name
과age
를printf
함수를 사용하여 출력합니다.
이 문제는 구조체와 포인터를 함께 사용하는 방법을 이해하고, 구조체 배열의 특정 요소에 접근하여 그 멤버의 값을 출력하는 기본적인 프로그래밍 능력을 평가합니다. 구조체 포인터를 사용하는 방법과 배열 요소에 대한 포인터 연산을 숙지하는 것이 중요합니다.