null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
구조체 포인터 접근하는 법
#c
#struct
#pointer
#arrow-operator
#embedded
@devpc
|
2026-05-04 12:39:59
|
GET /api/v1/nodes/442?nv=1
History:
v1 (2026-05-04) (Latest)
0
Views
1
Calls
# 구조체 포인터 접근하는 법 ## . 연산자와 -> 연산자 구조체를 직접 변수로 가지면 `.` 연산자로 멤버에 접근하고, 포인터로 가지면 `->` 연산자를 쓴다. ```c typedef struct { int id; char name[32]; } Node; Node n = { 1, "test" }; /* 직접 변수 */ Node *p = &n; /* 포인터 */ /* 두 표현은 동일하다 */ printf("%d\n", n.id); /* . 연산자 */ printf("%d\n", p->id); /* -> 연산자 */ printf("%d\n", (*p).id); /* -> 의 풀어쓴 형태 */ ``` `p->id`는 `(*p).id`의 축약이다. 실무에서는 항상 `->` 를 쓴다. --- ## 함수에 구조체를 넘기는 두 가지 방법 ### 값으로 전달 (복사) ```c void print_node(Node n) { printf("ID: %d, Name: %s\n", n.id, n.name); } /* 호출 */ print_node(n); /* n 전체가 스택에 복사됨 */ ``` 구조체 크기가 크면 스택 사용량과 복사 비용이 늘어난다. 임베디드에서는 주의. ### 포인터로 전달 (참조) ```c void print_node_ptr(const Node *n) { printf("ID: %d, Name: %s\n", n->id, n->name); } void update_score(Node *n, int new_id) { n->id = new_id; /* 원본 수정 */ } ``` 읽기 전용이면 `const Node *`, 수정 필요하면 `Node *`. 임베디드에서는 대부분 포인터로 전달한다. --- ## 구조체 포인터 배열 연결리스트, 테이블 등에서 구조체 포인터 배열이 자주 쓰인다. ```c #define MAX_NODES 8 Node nodes[MAX_NODES]; /* 실제 데이터 */ Node *ptrs[MAX_NODES]; /* 포인터 배열 */ /* 포인터 배열 초기화 */ for (int i = 0; i < MAX_NODES; i++) { ptrs[i] = &nodes[i]; } /* 접근 */ ptrs[0]->id = 42; ``` --- ## 임베디드 관용구: 레지스터 구조체 포인터 MCU 주변장치 레지스터를 구조체로 매핑할 때 포인터가 핵심이다. ```c typedef struct { volatile uint32_t CR; /* Control Register */ volatile uint32_t SR; /* Status Register */ volatile uint32_t DR; /* Data Register */ } USART_TypeDef; #define USART1 ((USART_TypeDef *)0x40011000UL) /* 레지스터 접근 */ USART1->CR |= (1u << 0); /* USART 활성화 */ uint32_t status = USART1->SR; ``` 이 패턴은 STM32/CMSIS 헤더 전체에서 쓰인다. `->` 이해 없이는 드라이버 코드를 읽을 수 없다.
// COMMENTS
Newest First
ON THIS PAGE