C에서 함수에 포인터 전달

안녕하세요, 자신을 위한 프로그래머 여러분! 오늘, 우리는 C 프로그래밍의 세계로 흥미진진한 여정을 떠날 것입니다. 특히 함수에 포인터를 전달하는 것에 집중할 것입니다. 이 개념에 нов하시다면 걱정하지 마세요. 저는 능숙한 교사처럼 여러분을 각 단계마다 신경 쓰게 안내할 것입니다. 그럼, 빠르게 시작해보겠습니다!

C - Passing Pointers to Functions

함수에 포인터 전달의 이점

코드를 작성하기 전에, C 프로그래밍에서 함수에 포인터를 전달하는 이유가 왜 그렇게 중요한지 이해해보겠습니다. 친구에게 레시피를 공유하는 것을 상상해보세요. 전체 코브컵을 주는 대신, 그에게 단지 페이지 번호를 알려주는 것처럼입니다. 이것이 바로 포인터를 사용하는 방식입니다!

다음은 주요 이점들입니다:

  1. 메모리 효율성: 포인터를 전달하는 것은 지도 대신 방향을 알려주는 것과 같습니다. 전체 데이터가 아니라 주소만을 전달하기 때문에 메모리를 적게 사용합니다.

  2. 속도: 작은 주소를 전달하는 것이 큰 데이터 덩어리보다 더 빠릅니다.

  3. 원본 데이터 수정 가능성: 포인터를 전달하면, 함수가 원본 데이터에 직접 접근하여 수정할 수 있습니다.

  4. 대형 데이터 구조 작업: 배열이나 구조체와 같은 큰 데이터 구조를 처리할 때, 포인터를 전달하는 것이 훨씬 더 효율적입니다.

함수에 포인터 전달 예제

이제 이 작업이 실제로 어떻게 작동하는지 간단한 예제를 통해 살펴보겠습니다:

#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;
}

이 예제에서, numbersprintArray에 전달될 때 자동으로 포인터로 변환됩니다. 출력은 다음과 같습니다:

배열 요소들은: 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