티스토리 뷰
🔷 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
✅ 결론
- 구조체가 값으로 선언된 경우에는 점(
.
) 연산자를 사용하여 멤버에 접근합니다. - 구조체가 포인터로 선언된 경우에는 화살표(
->
) 연산자를 사용하여 멤버에 접근합니다. - 구조체 포인터는 반드시 동적 할당을 하지 않아도 사용할 수 있으며, 이미 선언된 구조체의 주소를 저장해 사용할 수 있습니다.
- 화살표(
->
)는(*포인터).멤버
를 간략히 표현하는 문법으로, 가독성과 편의성이 높습니다.
'C언어' 카테고리의 다른 글
qsort와 compare 완벽 이해 (0) | 2025.07.18 |
---|---|
C언어에서 문자열 포인터와 서식문자(%c, %s) (0) | 2025.07.15 |
C언어 printf 소수점 출력 완전 정리 (0) | 2025.07.13 |
비트연산자 << 와 >> 총정리 (0) | 2025.07.10 |
C언어 2차원 배열과 포인터 정리 (0) | 2025.07.07 |
- Total
- Today
- Yesterday
- python 알고리즘
- 문자열처리
- 동적계획법
- Python
- DP
- 파이썬코딩
- 알고리즘
- dfs
- 그래프 탐색
- 문제풀이
- C++ 알고리즘
- 알고리즘 문제풀이
- 그리디
- 파이썬문제풀이
- 동적 계획법
- 알고리즘문제풀이
- 코딩 테스트
- 문제 풀이
- 알고리즘기초
- 백준
- 브루트포스
- 파이썬
- 프로그래밍
- 코딩테스트
- 객체지향
- 그리디알고리즘
- c++알고리즘
- 코딩
- c언어
- C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |