C++에서 함수호출시 인수로 값(기본형),포인터(타입),참조(타입)로 전달합니다.
포인터와 참조의 사용구분을 잘 이해하고 있지 못해서 정리합니다.
https://qiita.com/agate-pris/items/05948b7d33f3e88b8967
1.값전달
기본형(int,float,bool,char...)을 전달할때 주로 사용
값전달=복사 로 복사된 인수의 값을 변경해도 원래의 변수의 값은 변경되지 않음
복사되는것이기 때문에 부하발생 사이즈가 큰 데이터형에서는 일반적으로 사용안함
--------------------
#include <iostream>
using namespace std;
void printFunc(int a)
{
cout << "funcAddress. " << &a << endl;
cout << "func1. " << a << endl;
a+=a;
cout << "func2. "<< a << endl;
}
int main(void)
{
int i=2;
cout << "mainAddress. " << &i << endl;
cout << "main1. " << i << endl;
printFunc(i);
cout << "main2. " << i << endl;
return 0;
}
mainAddress. 0x6ffe3c <- 원래 변수의 메모리주소
main1. 2
funcAddress. 0x6ffe10 <- 복사된 인수의 메모리주소
func1. 2
func2. 4 <- 함수에 복사된 인수는 변경되나
main2. 2 <- 원래의 변수 값은 변경안됨
--------------------
2.포인터전달
변수의 메모리주소를 전달
간접참조의 형식으로 원래의 변수를 변경가능
주의: 널포인터가 가능하므로 사용전에 널 체크를 해야함
--------------------
#include <iostream>
using namespace std;
bool printFunc(int* a)
{
if(a==nullptr) <-널포인트체크가 없으면 에러가 발생합니다.
{
cout << "NullPtr Error" << endl;
return true;
}
cout << "funcAddress. " << a << endl;
cout << "func1. " << *a << endl;
*a+=*a;
cout << "func2. "<< *a << endl;
return false;
}
int main(void)
{
printFunc(nullptr);
int i=2;
cout << "mainAddress. " << &i << endl;
cout << "main1. " << i << endl;
printFunc(&i);
cout << "main2. " << i << endl;
return 0;
}
NullPtr Error <- 널포인트가 체크됩니다.
mainAddress. 0x6ffe3c <- 원래 변수의 메모리주소
main1. 2
funcAddress. 0x6ffe3c <- 포인터변수 메모리주소
func1. 2
func2. 4 <- 함수에서 포인터변수를 변경하면
main2. 4 <- 같은 주소의 원래 변수도 변경됩니다.
--------------------
3.잠조전달
참조형은 C++에서 추가.
안전하고 제한적인 포인터
원래 변수명의 별칭
널참조 불가하므로 초기화가 반드시 필요
포인터전달, 참조전달은 오버로드 가능
--------------------
#include <iostream>
using namespace std;
bool printFunc(int* a)
{
cout << "Pointer" << endl;
if(a==nullptr)
{
cout << "NullPtr Error" << endl;
return true;
}
cout << "funcAddress. " << a << endl;
cout << "func1. " << *a << endl;
*a+=*a;
cout << "func2. "<< *a << endl;
return false;
}
bool printFunc(int& a)
{
cout << "Reference" << endl;
cout << "funcAddress. " << &a << endl;
cout << "func1. " << a << endl;
a+=a;
cout << "func2. "<< a << endl;
return false;
}
int main(void)
{
printFunc(nullptr);
int i=2;
cout << "mainAddress. " << &i << endl;
cout << "main1. " << i << endl;
printFunc(&i);
printFunc(i);
cout << "main2. " << i << endl;
return 0;
}
Pointer
NullPtr Error
mainAddress. 0x6ffe3c
main1. 2
Pointer
funcAddress. 0x6ffe3c
func1. 2
func2. 4
Reference
funcAddress. 0x6ffe3c
func1. 4
func2. 8
main2. 8
--------------------
함수에 인수를 전달시 변수의 유지가 필요한 경우 안전을 위해 const를 적극 활욯합시다.