본문 바로가기
코딩/C, C++

[C++] 포인터 call by reference, new 연산자

by JuBro 2024. 3. 20.
728x90

오늘은 C++에서 포인터와, new 연산자 나아가서 vector 에 대해서 알아볼 것이다.

 

포인터 : what var point?

 

포인터는 말 그대로 무엇을 가르키는지 주소(위치)를 나타냅니다.

간접 참조 연산자 *을 사용하여 표현할 수 있습니다.

 

int a = 6;  //일반 변수 a
int* b; //변수의 주소(위치)를 담는 포인터 변수 b

b = &a; // a의 주소를 b에 대입, 이제 b는 a를 가르키는 포인터

cout << a << endl; //a의 값 = 6
cout << *b << endl; //b가 가르키는건? a이므로, *b = a의 값 = 6

 

프로그램을 실행하는 동안에, 이름이 없는 메모리, 아직 결정되지 않은 메모리를 대입할 수 있다는게 포인터의 진정한 쓸모입니다.

 

 

 

 

 

new 연산자 : 데이터형을 말해봐(메모리 할당)

원하는 데이터형을 new 연산자에게 말하면, 데이터형에 맞는 메모리블록을 찾은 후 주소를 리턴해줍니다.

int* pointer = new int;
delete pointer;
  • 메모리를 할당해서 데이터 객체를 가르키고 있다.
  • 메모리 제어권을 사용자한테 넘겨준다는 이점이 있다.
  • 이후 free()처럼, delete를 사용하여 메모리 할당 해제꼭!! 해야한다.

 

 

간단한 예시
#include <iostream>

int main(){
    using namespace std;

    int* nums = new int[4]; // int형 데이터 4개를 저장할 수 있는 공간 대입
    nums[0] = 4;
    nums[1] = 2;
    nums[2] = 1;
    nums[3] = 5;

    cout <<"nums is " << *nums << "\n";
    cout <<"nums[0] is " << nums[0] << "\n";
    cout <<"nums is " << nums << "\n";
    
	delete[] nums;    
    return 0;
}

코드를 보면 알다싶이, 포인터는 배열 형태로도 지정 할수도 있고, 이렇게 배열 형태로 지정해준다면 delete를 할 때도, 배열 대괄호 [] 을 사용해줘야한다.

 

 

실행결과 : 

그림으로 본다면, nums가 4개의 int 배열 형태의 메모리를 가르키고 있고, 그 첫번째 자리를 가르키고 있다.

각 배열도 포인터 역할을 하여, 그 메모리 공간에 할당된 값을 알려준다.

 

 

 

Call by reference


C언어와 다르게, C++ 에서는 매개변수를 참조변수로  선언하는 방식이 있습니다.

레퍼런스는 쉽게 생각해서, 변수의 다른이름(별명)을 지어주는 것입니다.

그래서 같은 메모리를 할당받고 있고, 다른 변수가 아닙니다.

void swap_call_by_address(int* num1, int* num2){
    int temp = *num1;
    *num1 = *num2;
    *num2 = temp;
}
swap(&a, &b);


void swap_call_by_reference(int& num1, int& num2){
    int temp = num1;
    num1 = num2;
    num2 = temp;
}
swap(a, b);

위의 swap 함수는, C에서 자주 쓰는 방법으로 주소를 복사하여 주소를 바꾸는 형식입니다.

int num = &a 라고 보면 이해가 더 쉽습니다.

아래는 래퍼런스 선언을 하여, 변수에 이름을 하나 더 지어줘서, 바꾼 것입니다.

int& num1 = a 라고 보면 이해가 더 쉽습니다.

 

그림으로 이해하기!

 

첫번째 call by address(pointer)는 포인터 변수가 새로 생겨서 메모리를 더 쓰게됩니다.

call by pointer는 외부 포인터가 내부 값을 머리끄댕이 잡고 바꿔주는 느낌입니다.

 

 

반면, call by reference는 그냥 메모리에 다른 이름(별명)을 하나 더 주어서,

C에서 했던 call by vlaue 느낌을 다른 함수에서도 쓸 수 있게 합법화(?)하는 느낌입니다.

 

 

 

REFERENCE
  • Inflearn - [하루 10분|C++] 누구나 쉽게 배우는 C++ 프로그래밍 입문

 

 

공부하면서 쓰는 내용이라 틀린부분이 있을 수 있습니다! 언제든 지적과 질문 환영합니다

728x90