728x90
1. 메모리 효율성
- 복사 비용 절감: 배열을 함수에 전달할 때, 배열의 모든 요소를 복사하는 대신 배열의 첫 번째 요소의 주소(포인터)를 전달합니다. 이는 메모리 사용량을 줄이고, 큰 배열을 다룰 때 성능을 크게 향상시킵니다.
2. 원본 데이터 수정 가능
- 원본 데이터 접근: 포인터를 사용하여 함수 내에서 배열의 요소를 직접 수정할 수 있습니다. 이를 통해 함수가 호출된 후에도 변경된 값을 유지할 수 있습니다.
#include <iostream>
void modifyArray(int* arr, int size) {
for (int i = 0; i < size; ++i) {
arr[i] += 10; // 원본 배열의 요소를 변경
}
}
int main() {
int arr[3] = {1, 2, 3};
modifyArray(arr, 3); // 배열의 주소를 전달
for (int i = 0; i < 3; ++i) {
std::cout << arr[i] << " "; // 11, 12, 13 출력
}
return 0;
}
3. 다양한 데이터 구조 처리
- 다양한 크기와 형태의 배열 처리: 포인터를 사용하면 크기가 정해지지 않은 배열, 동적 할당된 배열, 2차원 배열 등 다양한 형태의 데이터를 처리할 수 있습니다. 이는 함수의 유연성을 높입니다.
4. 동적 메모리 관리
- 동적 할당 배열 사용: 포인터를 사용하여 동적으로 메모리를 할당받은 배열을 함수에 전달할 수 있습니다. 이는 런타임 시 배열의 크기를 결정할 수 있게 해주며, 메모리 관리의 유연성을 제공합니다.
#include <iostream>
void createArray(int** arr, int size) {
*arr = new int[size]; // 동적 배열 할당
for (int i = 0; i < size; ++i) {
(*arr)[i] = i + 1; // 값 초기화
}
}
int main() {
int* arr = nullptr;
createArray(&arr, 5); // 배열의 주소를 전달
for (int i = 0; i < 5; ++i) {
std::cout << arr[i] << " "; // 1, 2, 3, 4, 5 출력
}
delete[] arr; // 동적 할당한 메모리 해제
return 0;
}
5. 함수 시그니처 간결화
- 간결한 함수 시그니처: 배열을 포인터로 전달하면 함수 시그니처가 간결해지며, 필요에 따라 배열의 크기를 추가 인자로 전달할 수 있습니다. 이는 코드의 가독성을 높여줍니다.
6. 다양한 데이터 타입 지원
- 템플릿 사용: 포인터를 이용하면 다양한 데이터 타입의 배열을 처리할 수 있는 템플릿 함수를 작성하는 것이 용이합니다. 이는 코드 재사용성을 높입니다.
#include <iostream>
template <typename T>
void printArray(T* arr, int size) {
for (int i = 0; i < size; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
int main() {
int arrInt[3] = {1, 2, 3};
double arrDouble[3] = {1.1, 2.2, 3.3};
printArray(arrInt, 3); // 1 2 3
printArray(arrDouble, 3); // 1.1 2.2 3.3
return 0;
}
결론
C++에서 포인터와 배열을 사용한 함수 인자 전달은 메모리 효율성을 높이고, 데이터 수정이 가능하며, 다양한 데이터 구조를 처리할 수 있는 유연성을 제공합니다. 이러한 특성들은 C++의 강력한 메모리 관리 및 데이터 처리 능력을 활용하는 데 큰 장점
728x90