구조체 포인터
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를 출력합니다.
이 챌린지는 구조체 포인터 선언, 주소 연산자를 이용한 주소 할당, 그리고 역참조 연산자와 점 표기법을 결합하여 포인터를 통해 구조체 멤버에 접근하는 방식에 대한 이해도를 테스트합니다. 또한 포인터가 구조체 변수의 주소를 올바르게 보유하고 있는지 확인하게 됩니다.
직접 해보기
#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;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.