반응형
Modern C++ 공부 Day 2입니다.
오늘 공부할 내용은 함수 인자 전달 방식 중 하나인 Pass by Address입니다.
공부를 시작하기 전에 이전 글인 Pass by value 포스트를 먼저 읽고 오시면 본 글을 이해하는 데 도움이 되실 겁니다.
2023.06.15 - [Programming/C++] - [Modern C++ 공부 - Day2] 값에 의한 전달 Pass by value
이전 포스트에서 Pass by value에 대해 알아보았습니다. 변수 x 값이 함수 test에 의해 변하지 않았죠. 만약 변수 x값을 함수 test를 통해 바꾸고 싶다면 Pass by Address 방법을 이용할 수 있습니다.
Pass by Address
Pass by Address는 말그대로 변수를 함수에 전달할 때 해당 변수의 주소를 전달하는 방식을 말합니다. 이 방식을 이용하여 전달된 변수의 원래 값에도 영향을 줍니다. 아래의 코드를 통해서 직관적으로 이해해봅시다.
void test(int *y) { // 변수 y는 함수 호출자의 변수 x의 주소를 저장하는 포인터.
*y = 7; // y가 가리키는 주소 (즉, 변수 x의 주소)에 있는 값을 7로 변경.
}
int x = 5;
test(&x); // 변수 x의 주소를 함수에 전달. 따라서, 변수 x의 값은 이제 7이 된다.
- 변수 y는 변수 x의 주소를 저장하는 포인터다.
- y 자체의 주소는 x의 주소와 다르지만, y가 가리키는 주소는 x의 주소와 동일하다.
- y가 가리키는 주소의 값을 참조하면, 변수 x가 있는 해당 메모리의 데이터를 반환한다.
- 그래서 그 데이터 값을 7로 바꾸면, 변수 x는 값 7을 가지게 된다.
이번에도 변수의 주소값과 데이터 값을 출력해서 더 명확하게 이해해 보도록 하겠습니다.
#include <iostream>
using namespace std;
int test(int *y) {
cout << "변수 y의 주소는: " << &y << endl;
cout << "변수 y의 값은: " << y << endl;
*y = 20;
return *y;
}
int main() {
int x = 10;
cout << "변수 x의 주소는: " << &x << endl;
int z = test(&x);
cout << "변수 z의 주소는: " << &z << endl;
cout << "함수 test 호출 후 변수 x값은: " << x << endl;
cout << "함수 test 호출 후 변수 z값은: " << z << endl;
return 0;
}
위의 코드를 컴파일하면 아래와 같은 출력값을 얻을 수 있습니다.
변수 x의 주소는: 0x61ff0c
변수 y의 주소는: 0x61fef0
변수 y의 값은: 0x61ff0c
변수 z의 주소는: 0x61ff08
함수 test 호출 후 변수 x값은: 20
함수 test 호출 후 변수 z값은: 20
출력값을 보면, 명확히 다음의 사실을 알 수 있습니다.
- 변수 x, y, z는 독립된 변수다.
- 변수 y의 값은 변수 x의 주소다. 즉, 변수 y는 변수 x의 주소값을 가진 포인터다.
- 함수 test에서 포인터 y를 통해 변수 x의 값을 직접적으로 바꿨다.
- 함수 test가 Pass by Address를 통해 인자를 받기 때문에 변수 x의 값이 함수 test 호출 후 변화된다.
요약
- Pass by Address는 함수에 인자로 변수의 주소가 전달된다.
- 이 주소는 함수 내부에서 새로운 포인터 변수로 저장되며, 이 포인터 변수는 원본 변수를 가리킨다.
- 함수 내부에서 이 포인터를 사용해 원본 변수의 값을 읽거나 변경할 수 있다.
- 포인터를 통해 원본 변수에 접근하기 때문에, 원본 변수의 값이 함수 내부에서 변경될 경우 이 변경이 원본 변수에 반영됩니다.
- Pass by Address 방식을 사용하면 원본 변수를 변경할 필요가 있거나, 큰 데이터 구조를 복사하는 비용을 피하고 싶을 때 유용하게 사용될 수 있다.
지금까지 Pass by Address에 대해서 알아봤습니다.
다음 포스트에서는 Pass by Reference 참조에 인한 전달에 대해 알아보겠습니다.
2023.06.15 - [Programming/C++] - [Modern C++ 공부 - Day4] 참조에 의한 전달 Pass by Reference
728x90
반응형
'Programming > C++' 카테고리의 다른 글
[Modern C++ 공부 - Day5] 상수 참조에 의한 전달 Pass by const Reference (0) | 2023.06.15 |
---|---|
[Modern C++ 공부 - Day4] 참조에 의한 전달 Pass by Reference (0) | 2023.06.15 |
[Modern C++ 공부 - Day2] 값에 의한 전달 Pass by value (0) | 2023.06.15 |
[Modern C++ 공부 - Day1] 지역 변수 local variable (0) | 2023.06.15 |
[Modern C++ 공부 - Day0] C++11, 14, 17는 뭐가 다를까? (1) | 2023.06.15 |