구조체 포인터(pointer to structure)는 구조체 전체의 주소값을 저장하는 포인터입니다. 주로 연결 리스트(linked list), 트리(tree), 그래프(graph)와 같은 복잡한 자료 구조를 만들 때 활용됩니다.
구조체 포인터를 사용하면 멤버에 접근할 때 일반적인 점(.) 연산자 대신 화살표 연산자(->)라는 특수 연산자를 사용해야 합니다.
선언 방법
구조체 포인터는 다음과 같이 선언합니다.
struct tagname *ptr;
예를 들어 학생 구조체의 포인터는 아래처럼 선언할 수 있습니다.
struct student *s;
멤버 접근 방법
구조체 포인터의 멤버는 화살표 연산자(->)를 이용해 다음과 같이 접근합니다.
ptr->membername;
예를 들면 s->sno, s->sname, s->marks처럼 사용할 수 있습니다.
예제 1: 배열 요소 접근하기
다음은 구조체 포인터를 활용하는 C 프로그램 예제입니다.
#include<stdio.h>
struct classroom{
int students[7];
};
int main(){
struct classroom clr = {2, 3, 5, 7, 11, 13};
int *ptr;
ptr = (int *)&clr;
printf("%d",*(ptr + 4));
return 0;
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
11
코드 설명
여기서 포인터 변수 ptr은 객체 clr의 첫 번째 값인 2가 저장된 주소를 가리킵니다. 그 후 포인터 주소를 4만큼 증가시켜 해당 위치의 값을 출력합니다.
각 인덱스별 값은 다음과 같습니다.
*(ptr + 0) = 2 *(ptr + 1) = 3 *(ptr + 2) = 5 *(ptr + 3) = 7 *(ptr + 4) = 11 *(ptr + 5) = 13
예제 2: 구조체 멤버 출력하기
구조체 포인터의 개념을 더 쉽게 이해할 수 있는 간단한 예제를 살펴보겠습니다.
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\n");
printf ("Number = %d\n", st ->sno);
printf ("name = %s\n", st->sname);
printf ("marks =%f", st->marks);
getch ( );
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
enter sno, sname, marks :1 bhanu 69 details of the student are Number = 1 name = bhanu marks =69.000000
이처럼 구조체 포인터는 &(주소 연산자)로 구조체 변수의 주소를 받아온 뒤, 화살표 연산자(->)를 통해 각 멤버에 손쉽게 접근할 수 있습니다. 이러한 특성 덕분에 동적 메모리 할당과 함께 복잡한 자료 구조를 효율적으로 구현할 수 있습니다.