null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
⌂
C언어 실전 코드 패턴
Structure
struct
•
구조체 배열 선언과 초기화
•
구조체 포인터 접근하는 법
•
Swap 함수를 구조체에 적용하기
•
연결리스트 삽입·삭제·정렬
memory-pointer
•
malloc·free 사용 패턴
•
포인터로 Swap 구현하기
•
배열 복사 — memcpy vs 루프 비교
string-impl
•
strlen을 직접 짜면
•
strcpy를 직접 짜면
•
strcat·strcmp 구현과 안전한 대안
const-module
•
const 올바른 사용법
•
.h 파일과 .c 파일 역할 구분
•
파일 입출력 패턴
practical-tricks
•
가변길이 배열 파라미터 처리
•
!! 이중 부정 연산자
•
Windows 소켓 에러 모음
•
미니 프로젝트 — 영타 연습기 만들기
Flow Structure
malloc·free 사용 패턴
6 / 17
배열 복사 — memcpy vs 루프 비교
☆ Star
↗ Full
포인터로 Swap 구현하기
#c
#pointer
#swap
#string
#embedded
@devpc
|
2026-05-04 12:40:00
|
GET /api/v1/flows/25/nodes/446?fv=1&nv=1
Context:
Flow v1
→
Node v1
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 변수를 쓰는 게 더 빠르고 명확하다.
malloc·free 사용 패턴
배열 복사 — memcpy vs 루프 비교
// COMMENTS
Newest First
ON THIS PAGE
No content selected.