C++ Programming

[ C++ ] 반환 자료형의 세가지 형태, 매개변수의 세가지 형태

psy_er 2021. 11. 6. 01:50
728x90

[ C++ ] 반환 자료형의 세 가지 형태, 매개변수의 세 가지 형태

 

[매개변수의 세 형태]

값에 의한 전달 > 인수에 영향을 주지 못함

주소에 의한 전달 (포인터)

레퍼런스에 의한 전달 (레퍼런스)

 

한계 : 함수 호출 문을 보고 값에 의한 전달인지 레퍼런스에 의한 전달인지 모른다.

 

const 레퍼런스를 사용하면 실 인수 변경이 불가능하다.

매개변수를 통한 변경을 방지할 때 사용할 수 있다.

 

 

[반환 자료형의 세 형태]

1. 값에 의한 반환 (복사 반환)

main()
int x; int y;
y = increment(x);
int increment(int n){
n = n + 1;
return n;}

 

2-1. 주소(*)에 의한 반환 (포인터 매개변수, 주소 값 반환)

main()
int x; int* y;
y = increment(&x);
cout << *y << endl;
int* increment(int* n){
*n = *n + 1;
return n;}

 

2-2. 주소(*)에 의한 반환 (레퍼런스 매개변수, 주소 값 반환)

main()
int x; int* y;
y = increment(x);
cout << *y << endl;
int* increment(int& n){
n = n + 1;
return &n;}

 

3-1. 레퍼런스에 의한 반환 (포인터 매개변수, 레퍼런스 반환)

main()
int x; int y;
y = increment(&x);
cout << y << endl;
int& increment(int* n){
*n = *n + 1;
int & k = *n;
return k;}

 

3-2. 레퍼런스에 의한 반환 (레퍼런스 매개변수, 레퍼런스, 반환)

main()
int x; int y;
y = increment(x);
cout << y << endl;
int& increment(int& n){
n = n + 1;
return n;}

 

지역 변수는 값에 의한 반환으로만 반환됨.

지역 변수는 주소(*), 레퍼런스(&)에 의해서 반환 X

포인터, 레퍼런스 반환은 유효한 동적 포인터, 레퍼런스로 받음

 

지역 변수는 주소(*)에 의해서, 레퍼런스(&)에 의해서 반환될 수 없다.

따라서 지역변수는 값에 의해서만 반환되어야 한다.

 

 

어떤 함수의 반환 자료형이 포인터, 즉 주소를 반환하면 함수에서 반환한 주소가 호출 측에서 받아 사용할 때도 유지되어야 한다. 따라서 지역변수에 대한 주소를 반환하는 것은 불가하다.

보통 동적 할당된 곳에 주소를 반환할 것이다.

 

 

strcpy는 주소 값을 매개변수로 받고, 반환도 포인터를 통해 주소로 반환하는 경우이다. return &; 주소를 반환받을 포인터 변수를 메인 함수에서 설정해 주소 값을 저장한다.

 

 

주소 값 반환 시에 지역변수가 사라지지 않으려면 동적 할당된 변수를 함수에게 넘겨줘야 한다.

 

728x90