본문 바로가기

C++

C++ 함수에 값전달, 포인터전달, 참조전달

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를 적극 활욯합시다.


반응형