구조체 포인터는 원본 구조체를 가리키므로 . 대신 ->로 읽는 순간부터 원본 수정이 연결됩니다.
여기서는 구조체 값을 복사하지 않고, 원본 구조체를 직접 다루는가를 중심으로 봅니다.
- 값 변수다:
. - 구조체 포인터다:
-> - 함수 안에서 원본 구조체를 수정한다: 포인터 전달
숏컷 코드
c
typedef struct {
char name[20];
int score;
} Student;
Student s = {"Kim", 90};
Student *ptr = &s;
ptr->score += 5;문법
->는 구조체 포인터를 위한 전용 문법입니다. 의미상으로는 (*ptr).field와 같지만, 구조체 포인터를 자주 다루는 C에서는 이 축약형이 사실상 기본입니다.
c
Student s = {"Kim", 90};
Student *ptr = &s;
printf("%d\n", (*ptr).score);
printf("%d\n", ptr->score);수정 흐름
구조체를 값으로 넘기면 복사본을 수정하고, 구조체 포인터를 넘기면 원본을 직접 수정합니다. .와 ->의 차이보다 이 차이가 더 중요합니다.
c
void reset(Student *s) {
s->score = 0;
}동적 할당 구조체에서는 손에 들고 있는 값이 곧 포인터이므로 ->가 기본이 됩니다.
c
Student *s = malloc(sizeof(*s));
if (s != NULL) {
s->score = 100;
}체크포인트
- 값 변수 필드 접근이다:
. - 구조체 포인터 필드 접근이다:
-> - 원본 구조체를 수정한다: 포인터 전달
- 동적 할당 구조체다:
->+free - 포인터가 유효한지 먼저 확인
주의할 점
NULL 또는 해제된 구조체 포인터에 ->를 쓰면 즉시 위험한 동작으로 이어집니다.
c
Student *ptr = NULL;
/* ptr->score = 90; */구조체 포인터도 결국 포인터이므로, 유효 대상인지 먼저 확인하는 습관이 필요합니다.
참고 링크
1 sources