null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
포인터로 Swap 구현하기
#c
#pointer
#swap
#string
#embedded
@devpc
|
2026-05-04 12:40:00
|
GET /api/v1/nodes/446?nv=1
History:
v1 (2026-05-04) (Latest)
0
Views
1
Calls
# 포인터로 Swap 구현하기 ## 값 Swap vs 포인터 Swap 앞 챕터에서 기본 Swap을 봤다. 여기서는 포인터 자체를 교환하는 경우와 문자열 Swap을 다룬다. --- ## 문자열 포인터 Swap `char *` 포인터를 교환하면 실제 문자열 데이터를 복사하지 않고 가리키는 주소만 바꾼다. ```c #include <stdio.h> void swap_str_ptr(char **a, char **b) { char *tmp = *a; *a = *b; *b = tmp; } int main(void) { char *s1 = "Hello"; char *s2 = "World"; printf("Before: %s / %s\n", s1, s2); swap_str_ptr(&s1, &s2); printf("After: %s / %s\n", s1, s2); return 0; } ``` 출력: ``` Before: Hello / World After: World / Hello ``` `s1`, `s2`는 문자열 리터럴의 주소를 담은 포인터다. Swap 후에는 포인터가 서로 다른 리터럴을 가리킨다. --- ## char 배열 Swap (내용 교환) 포인터 교환이 아니라 배열 내용 자체를 교환해야 할 때: ```c #include <string.h> void swap_str_buf(char *a, char *b, size_t max_len) { char tmp[max_len]; /* C99 VLA */ strncpy(tmp, a, max_len); strncpy(a, b, max_len); strncpy(b, tmp, max_len); tmp[max_len - 1] = '\0'; a[max_len - 1] = '\0'; b[max_len - 1] = '\0'; } char name1[32] = "Alice"; char name2[32] = "Bob"; swap_str_buf(name1, name2, sizeof(name1)); /* name1 = "Bob", name2 = "Alice" */ ``` --- ## 포인터 배열 정렬 문자열 배열을 정렬할 때 포인터 Swap이 훨씬 효율적이다. ```c const char *words[] = { "banana", "apple", "cherry", "date" }; int n = 4; /* 버블 정렬 — 포인터만 교환 */ for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1 - i; j++) { if (strcmp(words[j], words[j+1]) > 0) { const char *tmp = words[j]; words[j] = words[j+1]; words[j+1] = tmp; } } } for (int i = 0; i < n; i++) printf("%s\n", words[i]); /* apple, banana, cherry, date */ ``` 문자열 내용을 복사하는 대신 포인터(주소값)만 교환하므로 훨씬 빠르다. --- ## XOR Swap — 쓰지 말아야 할 이유 ```c /* XOR Swap: tmp 변수 없이 교환 */ a ^= b; b ^= a; a ^= b; ``` 트릭으로는 재미있지만 실무에서 쓰면 안 된다: - `a == b`(같은 주소)일 때 0이 된다 - 컴파일러 최적화를 방해한다 - 가독성이 없다 일반 tmp 변수를 쓰는 게 더 빠르고 명확하다.
// COMMENTS
Newest First
ON THIS PAGE