구조체 포인터
Coddy C 여정의 Logic & Flow 섹션에 포함된 레슨 — 63개 중 44번째.
이제 구조체(structs)를 다루는 데 익숙해졌으니, 이를 또 다른 강력한 C 언어 개념인 포인터(pointers)와 결합해 볼 차례입니다. int나 char와 같은 기본 데이터 타입에 대한 포인터를 만들 수 있는 것처럼, 구조체 변수의 주소를 저장하는 포인터도 만들 수 있습니다.
구조체에 대한 포인터를 선언하는 구문은 다른 포인터 선언과 동일한 패턴을 따릅니다:
struct StructureName *pointerName;예를 들어, 익숙한 Point 구조체를 사용하면 다음과 같습니다:
struct Point p1 = {10, 20};
struct Point *ptr;이것은 Point 구조체의 주소를 저장할 수 있는 ptr이라는 이름의 포인터를 생성합니다. 포인터가 실제로 구조체 변수를 가리키게 하려면 주소 연산자(address-of operator)를 사용합니다:
ptr = &p1;이제 ptr은 p1 구조체 변수의 메모리 주소를 보유합니다. 이는 특히 구조체를 함수에 전달하거나 메모리를 동적으로 관리할 때 구조체를 다루는 새로운 가능성을 열어줍니다. 구조체에 대한 포인터는 더 복잡한 데이터 구조를 구축하고 효율적인 C 프로그램을 작성하는 데 필수적입니다.
챌린지
쉬움구조체 포인터를 다루는 C 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다:
- 다음 멤버를 포함하는
Product라는 이름의struct를 정의합니다:- 제품 ID를 저장할 정수형
id - 제품 이름을 저장할 크기 25의 문자 배열
name - 제품 가격을 저장할 실수형
price - 가용 수량을 저장할 정수형
quantity
- 제품 ID를 저장할 정수형
- main 함수에서
item이라는 이름의Product변수를 생성하고 다음 값으로 초기화합니다:- ID: 501
- Name: "Laptop"
- Price: 899.99
- Quantity: 15
itemPtr이라는 이름의Product구조체 포인터를 선언합니다.- 주소 연산자(address-of operator)를 사용하여
item변수의 주소를itemPtr에 할당합니다. - 구조체 멤버에 직접 접근하여(점 연산자 사용) 다음의 정확한 형식으로 원래 제품 정보를 출력합니다:
Original Product Info:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- 포인터를 통해 구조체 멤버에 접근하여(역참조 연산자와 점 표기법 사용:
(*itemPtr).member) 다음의 정확한 형식으로 동일한 제품 정보를 출력합니다:Product Info via Pointer:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- 메모리 주소를 다음의 정확한 형식으로 출력하여 포인터가 구조체를 올바르게 가리키고 있는지 확인합니다:
Address of item: [address]Value of itemPtr: [address]Address verification: [result]
주소 확인(address verification)의 경우, 주소가 같으면 Match를 출력하고, 다르면 No Match를 출력합니다.
이 챌린지는 구조체 포인터 선언, 주소 연산자를 이용한 주소 할당, 그리고 역참조 연산자와 점 표기법을 결합하여 포인터를 통해 구조체 멤버에 접근하는 방식에 대한 이해도를 테스트합니다. 또한 포인터가 구조체 변수의 주소를 올바르게 보유하고 있는지 확인하게 됩니다.
치트 시트
다른 포인터 선언과 동일한 구문을 사용하여 구조체에 대한 포인터를 생성할 수 있습니다:
struct StructureName *pointerName;포인터가 구조체 변수를 가리키게 하려면 주소 연산자(&)를 사용하세요:
struct Point p1 = {10, 20};
struct Point *ptr;
ptr = &p1;역참조 연산자와 점 표기법을 사용하여 포인터를 통해 구조체 멤버에 접근합니다:
(*ptr).member직접 해보기
#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;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.