구조체 포인터(pointer to structure)는 구조체 전체의 시작 주소를 저장하는 포인터입니다. C 언어에서 구조체 포인터는 연결 리스트(linked list), 트리(tree), 그래프(graph)처럼 노드 간 연결이 필요한 복잡한 자료 구조를 만들 때 필수적으로 활용됩니다.
일반 구조체 변수는 점(.) 연산자로 멤버에 접근하지만, 포인터로 구조체에 접근할 때는 화살표 연산자(->)라 불리는 특수 연산자를 사용합니다. 참고로 (*ptr).member 형태로 역참조 후 점 연산자를 쓰는 것과 결과는 같지만, 화살표 연산자가 더 간결하고 가독성이 좋아 널리 사용됩니다.
선언 방법
C 언어에서 구조체 포인터는 다음과 같은 형식으로 선언합니다.
struct tagname *ptr;
예를 들어, student 구조체를 가리키는 포인터 s는 아래와 같이 선언할 수 있습니다.
struct student *s;
멤버 접근 방법
구조체 포인터가 구조체 변수의 주소를 저장하고 있을 때, 화살표 연산자를 이용해 멤버에 접근합니다.
ptr->membername;
예시: s->sno, s->sname, s->marks
예제 프로그램 1
다음 프로그램은 구조체 변수의 주소를 포인터에 저장한 뒤, 화살표 연산자로 멤버 값을 출력하는 기본적인 사용법을 보여줍니다.
#include<stdio.h>
struct student{
int sno;
char sname[30];
float marks;
};
main ( ){
struct student s;
struct student *st;
printf("enter sno, sname, marks:");
scanf ("%d%s%f", & s.sno, s.sname, &s. marks);
st = &s;
printf ("details of the student are");
printf ("Number = %d\n", st ->sno);
printf ("name = %s\n", st->sname);
printf ("marks =%f\n", st ->marks);
getch ( );
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
enter sno, sname, marks:1 Lucky 98 details of the student are: Number = 1 name = Lucky marks =98.000000
예제 프로그램 2
두 번째 예제는 포인터를 통해 구조체 멤버에 직접 값을 입력받고 출력하는 과정을 보여줍니다. scanf 함수에서도 화살표 연산자를 활용할 수 있다는 점에 주목하세요.
#include<stdio.h>
struct person{
int age;
float weight;
};
int main(){
struct person *personPtr, person1;
personPtr = &person1;
printf("Enter age: ");
scanf("%d", &personPtr->age);
printf("Enter weight: ");
scanf("%f", &personPtr->weight);
printf("Displaying:\n");
printf("Age: %d\n", personPtr->age);
printf("weight: %f", personPtr->weight);
return 0;
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Enter age: 45 Enter weight: 60 Displaying: Age: 45 weight: 60.000000
정리
구조체 포인터는 구조체의 주소만 저장하면 되므로 메모리를 효율적으로 사용할 수 있으며, 함수에 구조체를 전달할 때 값 전체를 복사하는 대신 주소만 넘겨 성능상 이점도 얻을 수 있습니다. 동적 메모리 할당(malloc)과 함께 사용하면 연결 리스트, 트리 등 유연한 자료 구조를 구현할 수 있으므로, 화살표 연산자 사용법을 반드시 숙지해 두는 것이 좋습니다.