void processData(int data) {
data = data + 1; // 값을 복사했기 때문에 원본 데이터에 영향 없음
}
int main() {
int value = 5;
processData(value);
print("value=%d",value); // value 값은 여전히 5
}
포인터에 의한 전달 ( Pass by Pointer )
메모리 주소값만 복사되어 전달됩니다.
포인터 자체는 호출된 스택 프레임내에 생성되지만 크기는 항상 고정됩니다. ( 비트 시스템에 따라 크기 결정 )
호출된 함수 내에서 넘겨 받은 메모리 주소를 통해 원본 데이터에 직접 접근이 가능합니다.
void processData(int* data) {
*data = *data + 1; // 주소값을 넘겨 받아 원본 데이터를 수정
}
int main() {
int value = 5;
processData(&value);
print("value=%d",value); // value 값이 6으로 변경
}
참조에 의한 전달 ( Pass by Reference )
참조란 포인터의 역참조를 안전하게 추상화한것으로 실제로는 메모리 주소를 넘겨받지만 해당 메모리 주소의 값이 필요할 때 포인터를 역참조할 필요없이 일반 변수와 같은 형태로 접근이 가능합니다.
컴파일러 수준에서 원본 데이터의 별칭을 생성합니다.
내부적으로는 포인터와 동일하게 구현되지만 문법적으로 더 안전하고 직관적입니다.
void processData(int& data) {
data = data + 1; // 주소값을 넘겨 받아 원본 데이터를 수정
}
int main() {
int value = 5;
processData(value);
print("value=%d",value); // value 값이 6으로 변경
}