[C언어][초급] Chapter59. 구조체와 포인터 – 포인터로 구조체를 다루는 방법
구조체는 많은 데이터를 하나로 묶을 수 있어서 매우 유용하지만, 프로그램이 커질수록 구조체를 포인터로 다루는 일이 많아집니다.
특히 함수에 구조체를 넘길 때 포인터를 사용하면 메모리 사용을 줄이고 속도도 향상시킬 수 있습니다.
● 구조체 변수와 구조체 포인터
struct Student {
char name[20];
int age;
};
struct Student s1 = {"지수", 20};
struct Student *p = &s1;
위 코드에서 포인터 p는 s1 구조체의 주소를 저장합니다.
● 구조체 포인터로 값 접근
printf("%s %d\n", p->name, p->age);
구조체 포인터에서는 멤버에 접근할 때 화살표 연산자(→)를 사용합니다.
(*p).name처럼 괄호와 점 연산자를 써도 같은 결과입니다.
● 구조체 포인터를 함수에 전달
void printStudent(struct Student *s) {
printf("%s %d\n", s->name, s->age);
}
구조체 포인터를 함수 인자로 넘기면 값 복사 없이 원본 데이터를 직접 다룰 수 있습니다.
● 구조체 포인터의 활용
- 배열과 함께 사용할 때
- 동적 메모리 할당(malloc 등)과 함께 사용할 때
- 값 변경이나 데이터 전달 시 효율적으로 사용 가능
구조체 포인터는 데이터를 더 효율적으로 다루고 복잡한 프로그램을 구성할 때 필수적인 개념입니다.
많이 연습할수록 더 자연스럽게 사용할 수 있습니다.
● 실습 문제
문제 1
구조체 Student를 선언하고, 구조체 포인터를 이용해 name과 age를 출력하세요.
문제 2
구조체 포인터 p를 사용해 학생의 이름을 "유나"로 변경하는 코드를 작성하세요.
문제 3
함수에 구조체 포인터를 전달하는 장점은 무엇인가요?
문제 4
(*p).name과 p->name은 어떤 관계인가요?
문제 5
다음 코드에서 잘못된 부분을 찾아 수정하세요.
struct Student *ptr;
strcpy(ptr.name, "현수");
▶ 정답 확인하기
정답 1
struct Student s = {"지우", 21};
struct Student *p = &s;
printf("%s %d\n", p->name, p->age);
정답 2
strcpy(p->name, "유나");
정답 3
복사하지 않고 원본을 직접 다룰 수 있어 메모리를 절약하고 속도도 빠릅니다.
정답 4
둘은 같은 의미입니다. (*p).name은 p가 가리키는 구조체의 name이고, p->name은 이를 간단히 표현한 것입니다.
정답 5
포인터 ptr을 초기화하지 않았습니다. 구조체를 먼저 선언하고 주소를 넣어야 합니다.
수정 예: struct Student s; struct Student *ptr = &s;