[C++] 포인터, 값에 의한 전달, 주소에 의한 전달, 참조에 의한 전달에 대한 이야기


메모리에는 위치를 구분하기 위해 0번지부터 시작해서 일련번호가 붙여져 있는데 이것을 주소(어드레스)라고 한다.

주소는 정수 형태이며 단위는 바이트이다. 컴퓨터가 데이터를 처리하려면 먼저 데이터를 메모리(램)으로 옮겨야한다.


포인터란?


컴퓨터의 메모리 번지(address)로, 데이터가 어디에 저장되어 있는지를 알려준다. C++에서는 이 포인터(변수의 주소)를 직접 사용할 수 있도록 포인터 연산자(&)를 제공한다.


& - 주소

* - 값



포인터 변수?


주소만을 저장한다. 포인터 변수는 선언할 때 반드시 기호를 덧붙여야 한다. 포인터 변수를 단독적으로 p라고 사용하는 것은 포인터값(주소)를 의미하지만, 포인터 변수에 *를 덧붙인 *p는 더 이상 주소가 아니라 해당 주소에 저장된 값을 의미한다.

그래서 p에는 변수 a의 주소가 저장되어 있으므로 *p는 변수 a의 값을 출력한다.


대입 연산자로 값을 대입할 경우 대입 연산자 오른쪽과 왼쪽에 오는 자료형이 같아야 한다.



매개변수의 전달?


함수에 사용될 데이터를 보내는 방법이다.



전달하는 방법 3가지


1. 에 의한 전달 방식( Call by Value)

2. 주소에 의한 전달 방식( Call by Address)

3. 참조에 의한 전달 방식( Call by Reference)



1. 값에 의한 전달 방식( Call by Value)


호출 측의 실 매개변수는 함수 측으로 값만 전달한다.
함수 측에서는 형식 매개변수가 실 매개변수와 별도로 기억공간을 할당받고 그 곳에 실 매개변수에 저장되었던 값만 전달받아 복사
이 방식은 별개의 기억공간이 사용되므로 실 매개변수의 값은 변경되지 않아요.
바꾸고 싶다면 return값을 이용하세요.


2. 주소에 의한 전달 방식( Call by Address)


실 매개변수로 변수의 주소값을 넘겨주고, 형식 매개변수가 이를 포인터 변수에 저장하도록 한다.



* 3. 참조에 의한 전달 방식( Call by Reference)

C++에 추가된 것 중에 하나가 레퍼런스(참조)변수이다. 레퍼런스 변수란 별명(일종의 다른이름)을 의미한다. 레퍼런스 변수는 따로 기억공간이 할당되지 않는다. 메모리 상에 오로지 하나만 존재하고, 여러 이름으로 접근해서 사용할 수 있도록 한다.

자료형 & 별명 = 변수_이름;

<< 이렇게 선언하는 것 말고는 일반 변수처럼 사용하면된다. *,&이런거 생각할 필요가 없어요!  >>

이때 사용된 &기호는 참조 연산자라고 한다.
따라서 변수 선언시 & 기호가 사용된 경우 - 참조 연산자
선언이 끝난 변수에 사용되는 & 기호가 사용된 경우 - 주소 연산자

*레퍼런스 변수를 선언할 때 주의할 점은 반드시 변수 선언시 초기값을 주어야 한다는 것이다.