C에서 포인터 배열 초기화
안녕하세요, 미래의 코딩 슈퍼스타 여러분! 오늘 우리는 C에서 포인터 배열의 fascinatng 세계로 뛰어들어 보겠습니다. 프로그래밍에 처음이라면 걱정 마세요 - 저는 수년 동안 수많은 학생들을 가르치면서 단계별로 안내해 드릴 것입니다. 그럼, 좋아하는 음료를 한 잔 마시면서 이 흥미로운 여정에 함께 동행해 주세요!
C에서 포인터 배열을 어떻게 초기화하나요?
포인터 배열을 초기화하는 구체적인 내용에 들어가기 전에 포인터에 대해 간단히復習해 보겠습니다. 포인터는 컴퓨터 메모리의 위치를 가리키는 표지板처럼 생각하면 됩니다. 그런 다음, 포인터 배열을 이야기할 때, 그것은 표지板의 줄을 생각하면 됩니다. 각 표지板은 다른 위치를 가리킵니다.
간단한 예제로 시작해 보겠습니다:
int *ptr_array[5];
이 코드는 5개의 정수 포인터 배열을 선언합니다. 하지만 기억해야 할 점은, 여기서 우리는 표지板만 만들いただけ이며, 그 표지板이 가리키는 실제 데이터는 아직 설정되지 않았다는 것입니다. 새로운 마을에 공백의 표지板을 설치하는 것처럼, 그들은 존재하지만 아직 유용한 정보를 가리키지 않고 있습니다.
우리의 포인터 배열을 실제로 유용하게 하기 위해서는 초기화해야 합니다. 다음은 그 방법입니다:
int a = 10, b = 20, c = 30, d = 40, e = 50;
int *ptr_array[5] = {&a, &b, &c, &d, &e};
이 예제에서 우리는 5개의 정수 변수를 만들고 그 변수们的 주소를 포인터 배열에 초기화합니다. 이제 표지板에 목적지를 써넣은 것과 같습니다!
정적 키워드를 사용하여 포인터 배열 초기화
이제 static
키워드에 대해 이야기해 보겠습니다. C에서 static
은 변수를 프로그램의 수명 동안 살아 있게 유지하는 마법의 단어입니다. 포인터 배열에 static
을 사용하면, 배열이 한 번만 초기화되고 함수 호출 간에 값을 유지하게 됩니다.
다음은 예제입니다:
static int *ptr_array[3] = {NULL, NULL, NULL};
이 코드는 3개의 정수 포인터를 포함하는 정적 배열을 만들고, 모두 NULL
로 초기화합니다. 마치 우리 마을에 3개의 영구 표지板을 설치한 것처럼, 그들은 아직 목적지를 결정하지 않았습니다.
정수 포인터 배열 초기화
이제 실제적인 예제로 넘어가 보겠습니다. 다양한 정수를 가리키는 포인터 배열을 만들고 싶다면 어떻게 할까요?
int num1 = 10, num2 = 20, num3 = 30;
int *int_ptr_array[3] = {&num1, &num2, &num3};
for (int i = 0; i < 3; i++) {
printf("int_ptr_array[%d]의 값: %d\n", i, *int_ptr_array[i]);
}
이 코드에서 우리는 3개의 정수를 만들고 그 정수들의 주소를 포인터 배열에 초기화합니다. 그런 다음, for 루프를 사용하여 값을 출력합니다. 마치 마을의 각 집에 다른 번호를 부여하고 그 번호를 읽는 것과 같습니다!
직접 주소로 포인터 배열 초기화
때로는 포인터 배열을 직접 메모리 주소로 초기화하고 싶을 수 있습니다. 이 방법은 덜 흔하지만, 어떻게 작동하는지 알아 두는 것이 좋습니다:
int *direct_addr_array[3] = {(int*)100, (int*)200, (int*)300};
for (int i = 0; i < 3; i++) {
printf("direct_addr_array[%d]의 주소: %p\n", i, (void*)direct_addr_array[i]);
}
이제 우리는 특정 메모리 주소로 배열을 초기화하고 있습니다. 마치 마을의 매우 특정 GPS 좌표로 표지板을 설정하는 것과 같습니다. 하지만 이 방법은 메모리 주소에 대해 정확히 알고 있지 않으면 위험할 수 있으므로 조심해야 합니다!
기본 주소를 사용하여 배열 탐색
이제 멋진 기법을 배워보겠습니다. 포인터 산술을 사용하여 배열의 기본 주소를 통해 배열을 탐색할 수 있습니다:
int numbers[5] = {10, 20, 30, 40, 50};
int *base_ptr = numbers; // base_ptr는 numbers의 첫 번째 요소를 가리킵니다
for (int i = 0; i < 5; i++) {
printf("인덱스 %d의 값: %d\n", i, *(base_ptr + i));
}
이 예제에서 base_ptr
는 numbers
배열의 첫 번째 요소를 가리킵니다. base_ptr
에 i
를 더하여 배열의 각 요소에 접근할 수 있습니다. 마치 마을의 특정 집으로 이동하는 마법의 표지板을 가지고 있는 것과 같습니다!
문자 포인터 배열 초기화 (문자열)
문자 포인터 배열은 C에서 문자열을 저장하는 데 흔히 사용됩니다. 다음은 예제입니다:
char *fruits[] = {"Apple", "Banana", "Cherry", "Date", "Elderberry"};
for (int i = 0; i < 5; i++) {
printf("%d번 과일: %s\n", i+1, fruits[i]);
}
이 코드는 문자 포인터 배열을 만들고 각 포인터가 문자열 리터럴을 가리키도록 초기화합니다. 마치 마을의 농장 시장에서 각 표지板이 다른 과일 상점을 가리키는 것과 같습니다!
동적 배열 초기화
마지막으로, 동적으로 배열을 할당하는 방법에 대해 이야기해 보겠습니다. 컴파일 시간에 배열의 크기를 알 수 없는 경우 유용합니다:
int n = 3; // 이 값을 실행 시간에 변경할 수 있습니다
int **dynamic_ptr_array = (int**)malloc(n * sizeof(int*));
for (int i = 0; i < n; i++) {
dynamic_ptr_array[i] = (int*)malloc(sizeof(int));
*dynamic_ptr_array[i] = i * 10;
}
for (int i = 0; i < n; i++) {
printf("dynamic_ptr_array[%d]의 값: %d\n", i, *dynamic_ptr_array[i]);
}
// 할당된 메모리를 잊지 말고 해제하세요!
for (int i = 0; i < n; i++) {
free(dynamic_ptr_array[i]);
}
free(dynamic_ptr_array);
이 코드는 마치 마을의 새로운 동네를 요청하는 것과 같습니다. 우리는 표지板(dynamic_ptr_array
)를 먼저 만들고, 각 표지板에 대해 집(malloc(sizeof(int))
)을 짓고 그 안에 번호(i * 10
)를 넣습니다. 마을을 사용한 후에는 깨끗이 청소하여 할당된 메모리를 해제합니다.
그럼 이렇게 포인터 배열의 세계를 함께 탐험했습니다. 연습이 완벽을 만드는 것을 기억하고, 이 개념들을 실험해 보세요. 행복한 코딩 되세요!
방법 | 설명 | 예제 |
---|---|---|
기본 초기화 | 포인터 배열을 변수의 주소로 초기화 | int *ptr_array[5] = {&a, &b, &c, &d, &e}; |
정적 초기화 | 정적 배열을 초기화 | static int *ptr_array[3] = {NULL, NULL, NULL}; |
정수 포인터 배열 | 정수 포인터 배열을 초기화 | int *int_ptr_array[3] = {&num1, &num2, &num3}; |
직접 주소 초기화 | 배열을 직접 메모리 주소로 초기화 | int *direct_addr_array[3] = {(int*)100, (int*)200, (int*)300}; |
기본 주소 탐색 | 배열의 기본 주소를 사용하여 탐색 | int *base_ptr = numbers; |
문자 포인터 배열 | 문자 포인터 배열을 초기화 (문자열) | char *fruits[] = {"Apple", "Banana", "Cherry"}; |
동적 할당 | 동적으로 배열을 할당 | int **dynamic_ptr_array = (int**)malloc(n * sizeof(int*)); |
Credits: Image by storyset