Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어에서 구조체 포인터에 접근하는 방법 완벽 정리

구조체 포인터(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

이처럼 구조체 포인터는 &(주소 연산자)로 구조체 변수의 주소를 받아온 뒤, 화살표 연산자(->)를 통해 각 멤버에 손쉽게 접근할 수 있습니다. 이러한 특성 덕분에 동적 메모리 할당과 함께 복잡한 자료 구조를 효율적으로 구현할 수 있습니다.