-
[아는대로써보기] 포인터 - 4카테고리 없음 2021. 4. 13. 14:58
Keywords : 참조자, call-by-reference, call-by-value
&와 *의 사용에 혼동이 있었음
아래와 같이 메소드 "foo" 를 정의하는 경우,
A_arg 앞에 & 때문에 주소값을 파라미터로 받는다고 생각할 수 있지만,
#include <iostream> void foo(const int& A_arg) { std::cout << "A_arg is " << A_arg << std::endl; } int main(int argc, char* argv[]) { int A = 5; foo(A); return 0; }
이는 참조자로써,
main함수에서 "foo"함수를 호출할때, 변수 자체를 인자로 넣어주면,
해당 변수의 메모리 공간을 A_arg의 이름으로 참조한다는 뜻임.
A_arg는 포인터변수가 아니므로, A_arg를 이용해 직접적인 변형이 가능하며,
이 변형은 참조했던 메소드 밖의 변수에도 적용됨.
하지만 위의 코드에서는 "const int& A_arg"로 정의했으므로 값의 변경은 불가하나,
직접적으로 변수를 인자로 받는 경우보다, 복사 과정을 건너뛸 수 있어서, 빠르다!
따라서 아래와 같이 코드를 작성하게되면,
foo라는 함수가 호출되면서, 참조자를 통해 변수 A를 업데이트 했으므로,
출력은 아래와 같다.
#include <iostream> void foo(int& A_arg) { std::cout << "A_arg is " << A_arg << std::endl; A_arg += 2; std::cout << "\nA_arg is updated" << std::endl; std::cout << "A_arg is " << A_arg << std::endl; } int main(int argc, char* argv[]) { int A = 5; foo(A); std::cout << "\nfunction foo is done" << std::endl; std::cout << "A is " << A << std::endl; return 0; }
더보기A_arg is 5
A_arg is updated
A_arg is 7
function foo is done
A is 7