본문 바로가기
프로그래밍언어/C언어[초급]

[C언어][초급] Chapter59. 구조체와 포인터 – 포인터로 구조체를 다루는 방법

by about_IT 2025. 4. 19.

구조체는 많은 데이터를 하나로 묶을 수 있어서 매우 유용하지만, 프로그램이 커질수록 구조체를 포인터로 다루는 일이 많아집니다.

특히 함수에 구조체를 넘길 때 포인터를 사용하면 메모리 사용을 줄이고 속도도 향상시킬 수 있습니다.


● 구조체 변수와 구조체 포인터

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;