티스토리 뷰

반응형

🔷 C언어 구조체 포인터 완벽 가이드 — 점(.)과 화살표(->)의 차이와 예제

✅ 구조체란 무엇인가

구조체(struct)는 여러 개의 서로 다른 데이터 타입을 하나로 묶어 관리하는 C언어의 자료형입니다. 구조체를 사용하면 관련된 데이터를 하나의 그룹으로 표현할 수 있습니다. 예를 들어 학생의 이름과 나이를 함께 표현하는 경우 다음과 같이 정의합니다.

struct Student {
    char name[50];
    int age;
};
    

Student 구조체 안에는 name이라는 문자 배열과 age라는 정수가 포함됩니다. 구조체를 변수로 선언하면 다음과 같습니다.

struct Student s1;
    

s1은 메모리상에 구조체 전체 데이터가 저장된 값입니다. 구조체가 값으로 선언된 경우에는 멤버에 접근할 때 점(.) 연산자를 사용합니다.

s1.age = 20;
    

s1이라는 이름으로 메모리에 존재하는 구조체 안의 age 멤버에 접근하여 값을 할당합니다.


✅ 구조체 포인터란 무엇인가

구조체 포인터는 메모리에 저장된 구조체의 주소를 저장하고 그 구조체를 가리키는 포인터입니다. 구조체의 메모리 위치만 가지고 있으므로 구조체 전체를 복사하지 않고도 구조체 내부 데이터에 접근할 수 있습니다. 선언 방법은 다음과 같습니다.

struct Student *ptr;
    

ptr은 구조체의 주소를 저장하며, 메모리상에 존재하는 구조체의 내용을 가리킵니다.


✅ 구조체 포인터에서 멤버에 접근하는 방법

구조체가 값인지 포인터인지에 따라 멤버 접근 방법이 달라집니다.

  • 구조체가 값인 경우: 점(.) 연산자를 사용합니다.
  • s1.age = 20;
            

    s1은 구조체 값이므로 점(.)으로 멤버에 접근합니다.

  • 구조체가 포인터인 경우: 화살표(->) 연산자를 사용합니다.
  • ptr->age = 20;
            

    ptr은 구조체 포인터이므로 화살표(->)로 멤버에 접근합니다.

구조체 포인터는 메모리 주소만 가지고 있기 때문에 내부 데이터에 접근하려면 역참조가 필요합니다. 다음 두 표현은 동일합니다.

  • 역참조 후 점 연산자
  • (*ptr).age = 20;
            
  • 화살표 연산자
  • ptr->age = 20;
            

일반적으로 ptr->age를 사용하는 것이 더 간결하고 읽기 쉽습니다.


✅ 예제 1 — 동적 할당 없이 구조체 포인터 사용하기

이미 선언된 구조체의 주소를 구조체 포인터에 저장해 멤버에 접근하는 코드입니다. 구조체 변수 방식과 포인터 방식을 모두 출력합니다.

#include 

struct Person {
    char name[30];
    int age;
};

int main() {
    struct Person p1 = {"Tom", 25};
    struct Person *pPtr = &p1;

    pPtr->age = 26;

    printf("구조체 변수로 출력: 이름: %s, 나이: %d\n", p1.name, p1.age);
    printf("구조체 포인터로 출력: 이름: %s, 나이: %d\n", pPtr->name, pPtr->age);

    return 0;
}
    

출력 결과입니다.

구조체 변수로 출력: 이름: Tom, 나이: 26
구조체 포인터로 출력: 이름: Tom, 나이: 26
    

✅ 예제 2 — 동적 할당으로 구조체 포인터 사용하기

구조체 메모리를 프로그램 실행 도중에 동적으로 할당하고, 그 주소를 구조체 포인터에 저장해 사용하는 코드입니다. 구조체 변수 방식과 포인터 방식을 모두 출력합니다.

#include 
#include 

struct Student {
    char name[50];
    int grade;
};

int main() {
    struct Student *sPtr = malloc(sizeof(struct Student));

    sPtr->grade = 3;

    printf("구조체 포인터로 출력: 학년: %d\n", sPtr->grade);
    printf("구조체 변수로 출력: 학년: %d\n", (*sPtr).grade);

    free(sPtr);
    return 0;
}
    

출력 결과입니다.

구조체 포인터로 출력: 학년: 3
구조체 변수로 출력: 학년: 3
    

✅ 예제 3 — 배열과 구조체 포인터

구조체 배열을 다룰 때 포인터를 사용하여 멤버에 접근하는 코드입니다. 구조체 변수 방식과 포인터 방식을 모두 출력합니다.

#include 

struct Item {
    int id;
    double price;
};

int main() {
    struct Item items[2] = {{101, 9.99}, {102, 19.99}};
    struct Item *iPtr = items;

    for (int i = 0; i < 2; i++) {
        printf("구조체 변수로 출력: Item %d: id=%d, price=%.2f\n",
               i, items[i].id, items[i].price);
        printf("구조체 포인터로 출력: Item %d: id=%d, price=%.2f\n",
               i, iPtr->id, iPtr->price);
        iPtr++;
    }

    return 0;
}
    

출력 결과입니다.

구조체 변수로 출력: Item 0: id=101, price=9.99
구조체 포인터로 출력: Item 0: id=101, price=9.99
구조체 변수로 출력: Item 1: id=102, price=19.99
구조체 포인터로 출력: Item 1: id=102, price=19.99
    

✅ 결론

  • 구조체가 값으로 선언된 경우에는 점(.) 연산자를 사용하여 멤버에 접근합니다.
  • 구조체가 포인터로 선언된 경우에는 화살표(->) 연산자를 사용하여 멤버에 접근합니다.
  • 구조체 포인터는 반드시 동적 할당을 하지 않아도 사용할 수 있으며, 이미 선언된 구조체의 주소를 저장해 사용할 수 있습니다.
  • 화살표(->)는 (*포인터).멤버를 간략히 표현하는 문법으로, 가독성과 편의성이 높습니다.
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함
반응형