C 언어에서 포인터 배열

안녕하세요, 미래의 프로그래밍 마법사들! 오늘은 C 프로그래밍의 세계로 흥미진진한 여정을 떠나보겠습니다. 특히 포인터 배열의 흥미로운 개념을 탐구해보겠습니다. 처음에는 두려울 수 있지만, 이 튜토리얼을 끝내면 이 강력한 도구를 전문가처럼 사용할 수 있을 것입니다!

C - Array of Pointers

포인터 배열이란?

깊은 바다로 뛰어들기 전에 기본을 알아보겠습니다. 마법의 지팡이(포인터)가 여러 개 있고, 각 지팡이는 다른 주문(데이터)을 부르는 능력을 가지고 있다고 상상해보세요. 이 지팡이들을 깔끔하게 줄이는 것(배열)이 어떻겠습니까? 이것이 바로 포인터 배열의 본질입니다 - 메모리 주소의 모음을 줄여서 행동할 준비를 합니다!

C 프로그래밍에서 포인터 배열은 각 요소가 포인터인 배열입니다. 이 포인터들은 정수, 문자 또는 복잡한 구조체와 같은 다양한 데이터 타입을 가리킬 수 있습니다.

포인터 배열 생성

첫 번째 포인터 배열을 생성해보겠습니다. 이는 정상적인 배열을 생성하는 것과 비슷하지만, 약간의 차이가 있습니다:

data_type *array_name[size];

여기서, data_type는 포인터가 가리킬 데이터의 타입이고, array_name은 배열에 부여할 이름이며, size는 배열에 포함할 포인터의 수입니다.

간단한 예제를 통해 이를 볼 수 있습니다:

#include <stdio.h>

int main() {
int *number_pointers[5];  // 5개의 정수 포인터 배열 선언

int a = 10, b = 20, c = 30, d = 40, e = 50;

// 포인터에 주소 할당
number_pointers[0] = &a;
number_pointers[1] = &b;
number_pointers[2] = &c;
number_pointers[3] = &d;
number_pointers[4] = &e;

// 각 포인터가 가리키는 값을 출력
for(int i = 0; i < 5; i++) {
printf("number_pointers[%d]의 값 = %d\n", i, *number_pointers[i]);
}

return 0;
}

이 예제에서는 5개의 정수 포인터 배열을 생성하고, 다섯 개의 정수 변수의 주소를 이 포인터에 할당합니다. 마지막으로 각 포인터가 가리키는 값을 출력합니다.

이 코드를 실행하면 다음과 같은 결과를 볼 수 있습니다:

number_pointers[0]의 값 = 10
number_pointers[1]의 값 = 20
number_pointers[2]의 값 = 30
number_pointers[3]의 값 = 40
number_pointers[4]의 값 = 50

이不是很神奇吗? 우리는 첫 번째 포인터 배열을 만들었습니다!

정수 포인터 배열

이제 발이 살짝 물었으니, 정수 포인터 배열에 대해 더 깊이 들어보겠습니다. 이는 여러 배열을 작업할 때 또는 데이터를 실제로 이동하지 않고 배열을 정렬할 때非常有用합니다.

다음은 정수 포인터 배열을 사용하여 데이터를 정렬하는 예제입니다:

#include <stdio.h>

void swap(int **a, int **b) {
int *temp = *a;
*a = *b;
*b = temp;
}

int main() {
int numbers[] = {50, 30, 20, 10, 40};
int *ptr[5];

// 포인터 초기화
for(int i = 0; i < 5; i++) {
ptr[i] = &numbers[i];
}

// 포인터가 가리키는 값에 따라 포인터 정렬
for(int i = 0; i < 5; i++) {
for(int j = i + 1; j < 5; j++) {
if(*ptr[i] > *ptr[j]) {
swap(&ptr[i], &ptr[j]);
}
}
}

// 정렬된 값 출력
printf("정렬된 값: ");
for(int i = 0; i < 5; i++) {
printf("%d ", *ptr[i]);
}

// 원래 배열은 변경되지 않음
printf("\n원래 배열: ");
for(int i = 0; i < 5; i++) {
printf("%d ", numbers[i]);
}

return 0;
}

이 코드는 포인터 배열의 강력한 사용법을 보여줍니다. 우리는 포인터가 가리키는 값에 따라 포인터를 정렬하여 데이터를 실제로 이동하지 않고 정렬합니다. 마치 마법의 지팡이를 이동하지 않고도 주문서를 재배열하는 것과 같습니다!

문자 포인터 배열

다음으로 문자 포인터 배열에 대해 탐구해보겠습니다. 이는 C에서 문자열을 작업할 때 매우 유용합니다. 실제로, C에서 문자열 배열을 선언할 때 만들어지는 것은 문자 포인터 배열입니다!

다음은 이를 설명하는 예제입니다:

#include <stdio.h>

int main() {
char *fruits[] = {
"Apple",
"Banana",
"Cherry",
"Date",
"Elderberry"
};

int num_fruits = sizeof(fruits) / sizeof(fruits[0]);

printf("우리의 과일 바구니에는 다음과 같습니다:\n");
for(int i = 0; i < num_fruits; i++) {
printf("%s\n", fruits[i]);
}

// 과일을 변경해보겠습니다
fruits[1] = "Blueberry";

printf("\n약간의 마법 후, 우리의 과일 바구니는 이제 다음과 같습니다:\n");
for(int i = 0; i < num_fruits; i++) {
printf("%s\n", fruits[i]);
}

return 0;
}

이 과일 예제에서는 문자 포인터 배열(문자열 배열)을 생성합니다. fruits 배열의 각 요소는 각 과일 이름의 첫 번째 문자를 가리키는 포인터입니다.

마법은 여기서 시작됩니다. "Banana"를 "Blueberry"로 변경하는 것처럼 전체 문자열을 변경할 수 있습니다. 마치 전체 주문서를 변경하는 것과 같은 간단한 마법입니다!

구조체 포인터 배열

마지막으로, 포인터 배열의 가장 복잡하고 흥미로운 사용법을 탐구해보겠습니다 - 구조체를 가리키는 것입니다. 이는 복잡한 데이터 타입을 다루고 효율적으로 조작할 수 있는 유연성을 제공합니다.

다음은 이 개념을 설명하는 예제입니다:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Wizard {
char name[50];
char spell[50];
int power;
};

int main() {
struct Wizard *wizard_pointers[3];

// 마법사 생성 및 초기화
for(int i = 0; i < 3; i++) {
wizard_pointers[i] = (struct Wizard*)malloc(sizeof(struct Wizard));

printf("마법사 이름을 입력하세요: ");
scanf("%s", wizard_pointers[i]->name);

printf("마법사의 즐겨찾는 주문을 입력하세요: ");
scanf("%s", wizard_pointers[i]->spell);

printf("마법사의 힘 수준을 입력하세요: ");
scanf("%d", &wizard_pointers[i]->power);

printf("\n");
}

// 마법사 정보 출력
printf("우리의 강력한 마법사들:\n");
for(int i = 0; i < 3; i++) {
printf("마법사: %s, 즐겨찾는 주문: %s, 힘 수준: %d\n",
wizard_pointers[i]->name,
wizard_pointers[i]->spell,
wizard_pointers[i]->power);
}

// 할당된 메모리를 해제하세요!
for(int i = 0; i < 3; i++) {
free(wizard_pointers[i]);
}

return 0;
}

이 마법적인 예제에서는 Wizard 구조체를 가리키는 포인터 배열을 생성합니다. 이를 통해 각 마법사에 대해 동적으로 메모리를 할당하고, 화살표 연산자(->)를 사용하여 그들의 프로퍼티에 접근할 수 있습니다.

이 접근 방식은 복잡한 데이터 구조를 생성하고 조작할 때 유연성을 제공합니다. 마치 마법사처럼 동적으로 새로운 주문을 추가할 수 있는 마법의 책과 같습니다!

그리고 이렇게 끝내겠습니다, 젊은 프로그래머들! 우리는 C 언어에서 포인터 배열의 세계를 탐구한 여정을 마쳤습니다. 기본부터 더 복잡한 개념까지. 마치 어떤 강력한 마법처럼, 포인터 배열은 연습을 통해 마스터할 수 있습니다. 그래서 굳이 두려워말고 실험해보고 자신만의 마법 프로그램을 만들어보세요!

다음은 우리가 다룬 방법들의 빠른 참조 표입니다:

방법 설명
data_type *array_name[size]; 포인터 배열 선언
array_name[index] = &variable; 배열의 포인터에 주소 할당
*array_name[index] 포인터가 가리키는 값 접근
array_name[index]->member 포인터가 가리키는 구조체의 멤버 접근

계속 연습하고, 호기심을 지켜두며, 곧 마법사처럼 복잡한 프로그램을 쉽게 만들 수 있을 것입니다. 즐거운 코딩!

Credits: Image by storyset