포인터를 배열처럼 사용하는 것은 C와 C++에서 유용하게 활용될 수 있습니다. 포인터를 배열처럼 사용하는 기본 원리를 이해하면, 배열의 유연함을 포인터의 강력한 기능과 결합하여 다양한 데이터를 효율적으로 처리할 수 있습니다.
포인터와 배열은 C/C++에서 서로 밀접하게 연결되어 있습니다. 배열의 이름은 해당 배열의 첫 번째 원소를 가리키는 포인터로 암시적으로 변환됩니다. 이 특성을 활용하여 포인터를 배열처럼 사용할 수 있습니다.
정적 배열의 경우, 배열의 이름은 해당 배열의 첫 번째 원소를 가리키는 포인터입니다. 이를 통해 포인터를 배열처럼 사용할 수 있습니다.
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr; // 배열 이름은 포인터로 변환됨
// 포인터를 배열처럼 사용
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]); // 포인터를 배열처럼 인덱스 접근
}
printf("\\\\n");
return 0;
}
동적 메모리 할당을 통해 생성된 배열도 포인터를 통해 접근할 수 있습니다. 이 경우, malloc
또는 calloc
으로 메모리를 할당하고, 포인터를 배열처럼 사용할 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
int size = 5;
// 동적 메모리 할당
ptr = (int *)malloc(size * sizeof(int));
if (ptr == NULL) {
perror("Failed to allocate memory");
return 1;
}
// 동적 배열에 값 할당
for (int i = 0; i < size; i++) {
ptr[i] = i + 1;
}
// 포인터를 배열처럼 사용
for (int i = 0; i < size; i++) {
printf("%d ", ptr[i]);
}
printf("\\\\n");
// 메모리 해제
free(ptr);
return 0;
}
다차원 배열을 포인터로 처리할 때는 포인터 산술을 이용하여 각 요소에 접근할 수 있습니다.
#include <stdio.h>
int main() {
int arr[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
int *ptr = &arr[0][0]; // 2D 배열의 첫 번째 원소의 포인터
// 포인터를 배열처럼 사용하여 2D 배열 접근
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", ptr[i * 3 + j]); // 2D 배열을 1D로 간주하여 접근
}
printf("\\\\n");
}
return 0;
}
포인터를 배열처럼 사용할 때는 포인터 산술 연산을 잘 이해하고 활용해야 합니다. 포인터 산술 연산을 사용하여 포인터를 배열 인덱스처럼 활용할 수 있습니다.
ptr[i]
는 (ptr + i)
와 같습니다.포인터를 배열처럼 사용하는 것은 포인터가 배열의 첫 번째 원소를 가리키기 때문에 가능합니다. 이를 통해 다음과 같은 작업을 수행할 수 있습니다: