Menu
CoddyTech

구조체 포인터

Coddy C 여정의 논리 & 흐름 섹션에 포함된 레슨. 63개 중 44번째.

이제 구조체를 다루는 데 익숙해졌으니, 또 다른 강력한 C 개념인 포인터와 결합해 볼 차례입니다. int나 char와 같은 기본 데이터형의 포인터를 만들 수 있는 것처럼, 구조체 변수의 주소를 저장하는 포인터도 만들 수 있습니다.

구조체를 가리키는 포인터를 선언하는 구문은 다른 포인터 선언과 같은 패턴을 따릅니다.

struct StructureName *pointerName;

예를 들어, 익숙한 Point 구조체를 사용하면 다음과 같습니다.

struct Point p1 = {10, 20};
struct Point *ptr;

이렇게 하면 Point 구조체의 주소를 저장할 수 있는 ptr이라는 포인터가 생성됩니다. 포인터가 실제로 구조체 변수의 위치를 가리키게 하려면 주소 연산자를 사용합니다:

ptr = &p1;

포인터를 통해 멤버를 읽으려면 역참조한 다음 점 연산자를 사용하세요. .은 *보다 우선순위가 높으므로 괄호가 필요합니다:

printf("%d", (*ptr).x); // p1.x와 동일함

이제 ptr은 p1 구조체 변수의 메모리 주소를 저장합니다. 이를 통해 구조체를 다루는 새로운 가능성이 열립니다. 특히 함수에 구조체를 전달하거나 메모리를 동적으로 관리할 때 유용합니다. 구조체를 가리키는 포인터는 더 복잡한 데이터 구조를 만들고 효율적인 C 프로그램을 작성하는 데 필수적입니다.

challenge icon

챌린지

쉬움

구조체를 가리키는 포인터의 사용법을 보여 주는 C 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다.

  1. 다음 멤버를 포함하는 Product라는 이름의 struct를 정의합니다.
    • 제품 ID를 저장할 정수형 id
    • 제품 이름을 저장할 크기 25의 문자 배열 name
    • 제품 가격을 저장할 실수형 price
    • 사용 가능한 수량을 저장할 정수형 quantity
  2. main 함수에서 item이라는 이름의 Product 변수를 만들고 다음 값으로 초기화합니다.
    • ID: 501
    • 이름: "Laptop"
    • 가격: 899.99
    • 수량: 15
  3. itemPtr이라는 이름의 Product 구조체 포인터를 선언합니다.
  4. 주소 연산자를 사용하여 item 변수의 주소를 itemPtr에 할당합니다.
  5. 구조체 멤버에 직접 접근하여(점 연산자 사용) 다음과 같은 정확한 형식으로 원래 제품 정보를 출력합니다.
    • Original Product Info:
    • ID: [id]
    • Name: [name]
    • Price: [price]
    • Quantity: [quantity]
  6. 포인터를 통해 구조체 멤버에 접근하여(역참조 연산자와 점 표기법 사용: (*itemPtr).member) 다음과 같은 정확한 형식으로 동일한 제품 정보를 출력합니다.
    • Product Info via Pointer:
    • ID: [id]
    • Name: [name]
    • Price: [price]
    • Quantity: [quantity]
  7. 다음과 같은 정확한 형식으로 메모리 주소를 출력하여 포인터가 구조체를 올바르게 가리키는지 확인합니다.
    • Address of item: [address]
    • Value of itemPtr: [address]
    • Address verification: [result]

주소 확인에서는 두 주소가 같으면 Match를 출력하고, 다르면 No Match를 출력합니다.

이 과제에서는 구조체 포인터 선언, 주소 연산자를 사용한 주소 할당, 그리고 역참조 연산자와 점 표기법을 조합하여 포인터로 구조체 멤버에 접근하는 방법을 이해하고 있는지 확인합니다. 또한 포인터가 구조체 변수의 주소를 올바르게 저장하는지도 확인합니다.

직접 해보기

#include <stdio.h>
#include <string.h>

// TODO: 여기에 Product 구조체를 정의하세요

int main() {
    // TODO: 여기에 코드를 작성하세요
    // 1. Product 변수 'item'을 생성하고 초기화하세요
    // 2. 'itemPtr'이라는 이름의 Product 포인터를 선언하세요
    // 3. 'item'의 주소를 'itemPtr'에 할당하세요
    // 4. 점 연산자를 사용해 원래 상품 정보를 출력하세요
    // 5. (*itemPtr).member를 사용해 포인터를 통해 상품 정보를 출력하세요
    // 6. 주소를 출력하고 확인하세요
    
    return 0;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

논리 & 흐름의 모든 레슨

직접 연습해 보세요: 온라인 C 컴파일러