본문 바로가기

C++

[C++] 포인터를 함수에 input, return

포인터를 함수의 인자로 전달

#include <iostream>

using namespace std;


void double_data(int* int_ptr)
{
	*int_ptr *= 2;
}

int main()
{
	int value = 10;
	cout << value << endl;
	double_data(&value);
	cout << value << endl;
}

 

  • 함수 double_data는 input 인자로 int* int_ptr을 받고 있다. 👉 어떤 변수의 주소인 포인터를 입력으로 받아 처리하는 함수를 생성하는 것이 가능하다.
  • 해당 함수 내부에서 *int_ptr *= 2; 👉포인터에 저장돼있는 변수에 역참조하여 실제 값을 2배 곱한다.

 

 

 

 

포인터의 Return

int* largest_int(int* int_ptr1, int* int_ptr2)
{
	if (*int_ptr1 > *int_ptr2)
		return int_ptr1;
	else
		return int_ptr2;
}

 

  • 포인터로 함수에 input 뿐만 아니라 return 또한 가능하다.
  • 위 함수는 return 형태가 포인터이기 때문에 반환형 int*을 명시하여 int* largest_int라는 이름을 갖는다.

 

 

 

 

포인터의 Return 2

int* create_array(int size, int init_value = 0) {
	int* new_storage = nullptr;
	new_storage = new int[size];

	for (int i = 0; i < size; ++i)
		*(new_storage + 1) = init_value;
	return new_storage;
}

int main() {
	int* my_array = nullptr;

	my_array = create_array(100, 10);
	delete[] my_array;
}

 

  • 어떤 함수 내에서 동적으로 할당된 메모리 주소를 반환하는 것 또한 가능하다.
  • create_array 함수에서 new_storage = new int[size]를 통해 sizeof(int)*size 크기의 메모리 공간을 동적으로 할당 👉 C++에서 new로 할당한 메모리는 힙 영역에 저장됨.
  • 함수 내에서 할당된 메모리 주소를 return하는 것 또한 가능하다. 👉 main()의 my_array는 해당 배열이 담긴 첫 주소를 담고 있다.

 

 

 

 

허상 포인터 (Dangling pointer)

int main()
{
	int* val = new int;
	*val = 10;

	int* val2 = val;
	delete val2;

	cout << *val << endl;
}

 

  • 해당 코드의 출력 결과는 쓰레기 값이다.
  • val라는 포인터에는 int 10의 주소가 저장되어 있었음 👉 val2라는 포인터에 val에 담겨있는 주소를 그대로 할당.
  • 그러면 두 포인터 val, val2는 heap 공간에서 서로 같은 주소를 가리키고 있다.
  • 이때 둘 중 하나의 포인터가 메모리를 해제하는 경우, 두 포인터에서 모두 메모리가 해제되어 버린다. 주의!