포인터를 함수의 인자로 전달
#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 공간에서 서로 같은 주소를 가리키고 있다.
- 이때 둘 중 하나의 포인터가 메모리를 해제하는 경우, 두 포인터에서 모두 메모리가 해제되어 버린다. 주의!
'C++' 카테고리의 다른 글
[C++] 객체지향 프로그래밍 - 클래스와 객체 (2) (0) | 2024.10.26 |
---|---|
[C++] 객체지향 프로그래밍 - 클래스와 객체 (1) | 2024.10.20 |
[C++] 참조자 Reference (0) | 2024.10.20 |