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

C 언어 구조체 포인터 완벽 정리: 선언 방법부터 화살표 연산자 활용까지

구조체 포인터(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)과 함께 사용하면 연결 리스트, 트리 등 유연한 자료 구조를 구현할 수 있으므로, 화살표 연산자 사용법을 반드시 숙지해 두는 것이 좋습니다.