C언어 구조체 포인터
선수학습(2개)
요약
C언어 구조체 포인터의 개념과 화살표 연산자(->), 함수에서 구조체 포인터를 매개변수로 전달하여 원본을 수정하는 패턴을 알아봅니다. 정보처리기사 실기에 자주 출제되는 구조체 포인터 활용법을 정리합니다.
아래에서 하나씩 배울 내용을 미리 정리한 표입니다.
| 개념 | 설명 | 예시 |
|---|---|---|
| 구조체 포인터 선언 | 구조체 변수의 주소를 저장하는 포인터 | struct Student *p = &s1; |
| 화살표(->) 연산자 | 구조체 포인터로 멤버에 접근 | p->id |
(*p).멤버와 동일 | -> 없이 역참조 후 멤버 접근 | (*p).id |
| -> 체인 | 연결된 구조체를 따라가며 접근 | head->n2->n1 |
| 함수에 구조체 포인터 전달 | 함수에서 원본 구조체를 직접 수정 | init(&ba, ...) |
구조체 포인터란? 기초
포인터는 변수의 주소를 저장하는 변수입니다. 구조체 포인터는 구조체 변수의 주소를 저장하는 포인터입니다.
일반 포인터와 선언 방식이 같습니다. 자료형 뒤에 *를 붙이면 포인터가 됩니다.
| 일반 포인터 | 구조체 포인터 |
|---|---|
int *p = &a; | struct Student *p = &s1; |
| int 변수의 주소 저장 | struct Student 변수의 주소 저장 |
일반 포인터는 *p로 값에 접근하지만, 구조체 포인터는 멤버가 여러 개이기 때문에 어떤 멤버에 접근할지 지정해야 합니다. 이때 사용하는 것이 아래에서 배울 화살표(->) 연산자입니다.
화살표(->) 연산자 기초
구조체의 포인터로 멤버에 접근할 때는 화살표(->) 연산자를 사용합니다.

화살표 연산자: 주소로 이해하기
구조체 s1이 주소 100에 있고, 포인터 p가 주소 1000에 있다고 가정해 봅시다.

p->id는 (*p).id와 동일한 의미입니다. *p는 "p가 가리키는 곳의 값", 즉 구조체 s1 자체를 뜻합니다. (*p).id에서 괄호가 필요한 이유는 .이 *보다 우선순위가 높아서, 괄호 없이 *p.id로 쓰면 *(p.id)로 해석되기 때문입니다.
단계별로 풀어서 해석하기
->가 연속으로 이어지면 왼쪽부터 한 단계씩 풀어서 해석합니다.
주소로 이해하기
각 노드에 임의 주소를 부여하면 -> 체인을 더 명확하게 추적할 수 있습니다.

이 방식은 -> 체인이 길어질수록 유용합니다. 자세한 내용과 3단 이상 예시는 연결 리스트 - 단계별로 풀어서 해석하기를 참고하세요.
함수에서 구조체 포인터 사용 심화
구조체 포인터를 함수의 매개변수로 전달하면, 함수 내에서 원본 구조체의 값을 직접 수정할 수 있습니다. 이 패턴은 시험에 자주 출제됩니다.
아래 코드에서 typedef를 사용하여 struct 키워드 없이 Acc만으로 타입을 사용하고 있습니다.
| 호출 방식 | 설명 |
|---|---|
init(&ba, ...) | ba의 주소를 전달 |
a->acc = x | 포인터로 원본 멤버에 접근하여 수정 |
함수 호출: 주소로 이해하기
init(&ba, 9981, 2200.0) 호출 시, ba의 주소가 포인터 a에 복사됩니다.

a가 ba의 주소를 갖고 있기 때문에, a->acc = x는 main의 ba.acc를 직접 수정하는 것과 같습니다.
구조체를 값으로 전달하는 방식과 포인터로 전달하는 방식의 차이는 Call by Value vs Call by Reference에서 자세히 다룹니다.