C에서 함수에 포인터 전달
안녕하세요, 자신을 위한 프로그래머 여러분! 오늘, 우리는 C 프로그래밍의 세계로 흥미진진한 여정을 떠날 것입니다. 특히 함수에 포인터를 전달하는 것에 집중할 것입니다. 이 개념에 нов하시다면 걱정하지 마세요. 저는 능숙한 교사처럼 여러분을 각 단계마다 신경 쓰게 안내할 것입니다. 그럼, 빠르게 시작해보겠습니다!
함수에 포인터 전달의 이점
코드를 작성하기 전에, C 프로그래밍에서 함수에 포인터를 전달하는 이유가 왜 그렇게 중요한지 이해해보겠습니다. 친구에게 레시피를 공유하는 것을 상상해보세요. 전체 코브컵을 주는 대신, 그에게 단지 페이지 번호를 알려주는 것처럼입니다. 이것이 바로 포인터를 사용하는 방식입니다!
다음은 주요 이점들입니다:
-
메모리 효율성: 포인터를 전달하는 것은 지도 대신 방향을 알려주는 것과 같습니다. 전체 데이터가 아니라 주소만을 전달하기 때문에 메모리를 적게 사용합니다.
-
속도: 작은 주소를 전달하는 것이 큰 데이터 덩어리보다 더 빠릅니다.
-
원본 데이터 수정 가능성: 포인터를 전달하면, 함수가 원본 데이터에 직접 접근하여 수정할 수 있습니다.
-
대형 데이터 구조 작업: 배열이나 구조체와 같은 큰 데이터 구조를 처리할 때, 포인터를 전달하는 것이 훨씬 더 효율적입니다.
함수에 포인터 전달 예제
이제 이 작업이 실제로 어떻게 작동하는지 간단한 예제를 통해 살펴보겠습니다:
#include <stdio.h>
void modifyValue(int *ptr) {
*ptr = 100;
}
int main() {
int num = 10;
printf("전: %d\n", num);
modifyValue(&num);
printf("후: %d\n", num);
return 0;
}
이 예제에서, 우리는 num
의 주소를 modifyValue
함수에 전달합니다. 그런 다음, 함수는 그 주소의 값을 100으로 변경합니다. 이 프로그램을 실행하면 다음과 같은 출력이 나옵니다:
전: 10
후: 100
놀라운가요? 우리는 main
함수 내의 변수를 다른 함수 내에서 수정한 것입니다!
포인터를 사용하여 값 교환
이제 전통적인 프로그래밍 문제를 다루어볼까요? 두 값의 교환입니다. 이는 포인터가 정말 빛나는 부분입니다!
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 5, y = 10;
printf("교환 전: x = %d, y = %d\n", x, y);
swap(&x, &y);
printf("교환 후: x = %d, y = %d\n", x, y);
return 0;
}
이 这里, 우리의 swap
함수는 두 정수의 포인터를 받습니다. 그런 다음, 이 포인터를 사용하여 값을 교환합니다. 출력은 다음과 같습니다:
교환 전: x = 5, y = 10
교환 후: x = 10, y = 5
이는 마술 같지만, 그것은 단지 포인터의 힘입니다!
배열 포인터를 함수에 전달
C에서 배열과 포인터는 밀접하게 관련되어 있습니다. 배열을 함수에 전달할 때, 우리는 실제로 배열의 첫 번째 요소에 대한 포인터를 전달하고 있습니다. 이를 액션에서 볼 수 있습니다:
#include <stdio.h>
void printArray(int *arr, int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int numbers[] = {1, 2, 3, 4, 5};
int size = sizeof(numbers) / sizeof(numbers[0]);
printf("배열 요소들은: ");
printArray(numbers, size);
return 0;
}
이 예제에서, numbers
는 printArray
에 전달될 때 자동으로 포인터로 변환됩니다. 출력은 다음과 같습니다:
배열 요소들은: 1 2 3 4 5
문자열 포인터를 함수에 전달
C에서 문자열은 문자 배열로 볼 수 있으며, 문자열 포인터를 전달하는 방식은 배열 포인터를 전달하는 것과 유사합니다. 다음은 예제입니다:
#include <stdio.h>
void printString(char *str) {
while (*str != '\0') {
printf("%c", *str);
str++;
}
printf("\n");
}
int main() {
char greeting[] = "안녕, 세계!";
printf("인사는: ");
printString(greeting);
return 0;
}
이는 다음과 같은 출력을 합니다:
인사는: 안녕, 세계!
구조체 포인터를 함수에 전달
마지막으로, 구조체에 대한 포인터를 전달하는 방법을 살펴보겠습니다. 이는 큰 구조체를 다룰 때 특히 유용합니다:
#include <stdio.h>
struct Person {
char name[50];
int age;
};
void birthday(struct Person *p) {
p->age++;
}
int main() {
struct Person john = {"John Doe", 25};
printf("생일 전: %s는 %d살입니다\n", john.name, john.age);
birthday(&john);
printf("생일 후: %s는 %d살입니다\n", john.name, john.age);
return 0;
}
이 예제에서, 우리는 Person
구조체에 대한 포인터를 birthday
함수에 전달합니다. 그런 다음, 함수는 사람의 나이를 증가시킵니다. 출력은 다음과 같습니다:
생일 전: John Doe는 25살입니다
생일 후: John Doe는 26살입니다
그리고 이렇게 끝납니다! 우리는 C에서 함수에 포인터를 전달하는 기본 개념을 다루었습니다. 기억하십시오, 연습이 쌓이면 완벽하다는 말이 있습니다. 이러한 개념들을 실험해보세요. 코딩을 즐겁게!
메서드 | 설명 | 예제 |
---|---|---|
기본 포인터 전달 | 변수의 주소를 전달하여 직접 수정 | void modifyValue(int *ptr) |
값 교환 | 두 변수 간의 값을 교환하기 위해 포인터 사용 | void swap(int *a, int *b) |
배열 포인터 전달 | 함수에 배열을 효율적으로 전달 | void printArray(int *arr, int size) |
문자열 포인터 전달 | 함수에서 문자열 작업 | void printString(char *str) |
구조체 포인터 전달 | 복잡한 데이터 구조를 효율적으로 수정 | void birthday(struct Person *p) |
Credits: Image by storyset