구조체를 선언하고 나면, 그 안의 정보를 꺼내거나 수정할 수 있어야 합니다.
이를 위해 사용하는 것이 바로 멤버 접근 연산자입니다.
C언어에서는 구조체 멤버에 접근할 때 두 가지 방법을 사용합니다:
점 연산자(.)와 화살표 연산자(→)입니다.
● 점(.) 연산자: 일반 구조체 변수에서 사용
struct Student {
char name[20];
int age;
};
struct Student s1;
s1.age = 20;
구조체 변수가 직접 선언되어 있을 때는 점 연산자를 사용합니다.
● 화살표(→) 연산자: 구조체 포인터에서 사용
struct Student s1 = {"철수", 20};
struct Student *p = &s1;
p->age = 25;
printf("%s %d\n", p->name, p->age);
구조체 포인터를 사용할 때는 화살표 연산자를 사용하는 것이 일반적입니다.
● (*포인터).멤버도 가능하다
(*p).age = 25;
화살표 연산자는 사실 포인터를 먼저 역참조한 뒤 점 연산자를 사용하는 표현을 간략하게 줄인 것입니다.
즉, 괄호로 묶어서 (*p).멤버와 같이 쓰는 것도 완전히 올바른 방식입니다.
● 구조체를 포인터로 함수에 넘기는 예
void printStudent(struct Student *s) {
printf("%s %d\n", s->name, s->age);
}
함수 인자로 구조체를 포인터로 넘기면 메모리 절약과 값 수정이 가능합니다.
● 요약
- 점(.)은 구조체 변수에서 사용합니다.
- 화살표(→)는 구조체 포인터에서 사용합니다.
- (*포인터).멤버 형식도 완전히 유효한 방식입니다.
점과 화살표 연산자의 용도를 명확히 이해하면 구조체와 포인터를 자연스럽게 다룰 수 있습니다.
단순히 외우기보단, 메모리 흐름을 떠올리면서 연습하는 것이 중요합니다.
● 실습 문제
문제 1
학생 구조체 s1의 이름을 "민수"로 저장하고 출력하세요. (점 연산자 사용)
문제 2
구조체 포인터 p를 사용해 나이를 30으로 저장하고 출력하세요. (화살표 연산자 사용)
문제 3
점 연산자와 화살표 연산자의 차이를 설명하세요.
문제 4
포인터 p를 사용해 (*p).name = "철수"와 p->name 중 어떤 것이 더 권장되는 표현인가요?
문제 5
구조체 포인터에서 점 연산자를 쓰기 위한 조건은 무엇인가요?
▶ 정답 확인하기
정답 1
struct Student s1;
strcpy(s1.name, "민수");
printf("%s\n", s1.name);
정답 2
struct Student s1;
struct Student *p = &s1;
p->age = 30;
printf("%d\n", p->age);
정답 3
점 연산자는 구조체 변수에서 사용하고, 화살표 연산자는 구조체 포인터에서 사용합니다.
정답 4
둘 다 올바르지만, 간결하고 가독성 좋은 표현인 p->name이 더 많이 쓰이고 권장됩니다.
정답 5
포인터를 괄호로 묶어 먼저 역참조하면 점 연산자를 사용할 수 있습니다. 예: (*p).멤버
'프로그래밍언어 > C언어[초급]' 카테고리의 다른 글
[C언어][초급] Chapter58. 중첩 구조체 – 구조체 안에 또 다른 구조체 담기 (0) | 2025.04.19 |
---|---|
[C언어][초급] Chapter57. 구조체 배열 – 여러 개의 구조체를 한 번에 관리하는 방법 (0) | 2025.04.19 |
[C언어][초급] Chapter55. 구조체의 선언과 사용 – 여러 데이터를 하나로 묶는 방법 (0) | 2025.04.19 |
[C언어][초급] Chapter54. 포인터를 이용한 함수 호출 – (call by value, call by reference) (0) | 2025.04.19 |
[C언어][초급] Chapter53. 포인터와 문자열 – 문자열을 더 유연하게 다루는 방법 (0) | 2025.04.19 |