본문 바로가기
Programming/C++

C++ 언어 기초 (4) - 포인터, 동적 메모리 할당, 참조

by 롱일스 2020. 8. 26.
반응형

▣ 포인터

 ●  포인터(pointer)란?

  ▷ 다른 변수, 구조체, 객체 등 값이 저장된 곳을 가리키는 변수

  ▶ 포인터 선언 형식

TypeName *ptrVar;
//TypeName : 가리킬 값의 자료형
// ptrVar : 포인터 변수의 이름

  ▷ 포인터의 사용

ptrVar = &var;  // & : 주소 계산 연산자
*ptrVar = value;   // *ptrVar : 포인터 ptrVar가 가리키는 곳 

  ▶ 포인터 사용의 예 - SimplePt.cpp

#include <iostream>
using namespace std;

int main()
{
	int a = 10;
	int *ptr;
	
	ptr = &a;
	cout << "ptr이 가리키는 값 : " << *ptr << endl;
	*ptr = 20;
	cout << "변수 a의 값 : " << a << endl;
	return 0;
 } 

 

▣ 동적 메모리 할당

 ●  동적 메모리 할당이란?

  ▷ 프로그램 동작 중에 기억공간의 필요성 및 소요량을 결정하여 필요한 공간을 할당하는 것

    1) 기억 공간의 생성 시점: new 연산자의 실행 시점
    2) 기억 공간의 소멸 시점: delete 연산자의 실행 시점

  ▶ 포인터 변수가 할당된 기억 공간을 가리키게 한다

  ▷ 메모리 할당 연산자

    1) ptrVar = new TypeName;
    2) ptrVar = new TypeName[n];

   메모리 반납 연산자

    1) delete ptrVar;
    2) delete [ ] ptrVar;

  ▷ 단일 데이터 공간의 할당 및 반환 예 - 1

int *intPtr;
intPtr = new int;
*intPtr = 10;

   단일 데이터 공간의 할당 및 반환 예 - 2

int *intPtr;
intPtr = new int;
*intPtr = 10;
...
delete intPtr;
intPtr = nullptr;

자유 메모리 공간을 반환한 후에 nullptr로 설정하여 intPtr 포인터가 아무도 가리키지 않는다는 걸 보여줘야 한다.

  ▷ 단일 데이터 공간의 할당 및 반환 예 - 3

int *intPtr;
intPtr = new int[4];
*intPtr = 10;
*(intPtr+1) = 20;
intPtr[2] = 30;
...
delete [] intPtr;
intPtr = nullptr;

▣ 참조

 ●  l-value 참조

  ▷ 참조(reference)란?

    1) 어떠한 대상을 가리키는 값(포인터와 유사함)
    2) 참조 변수는 참조 대상의 별명처럼 사용할 수 있다.
    3) l-value 참조 : 실체가 있는 대상(l-value)에 대한 참조

  ▶ l-value 참조 변수의 선언 형식

TypeName &refVar = varName;
// TypeName : 참조 대상의 자료형
// refVar : 참조 변수의 이름
// varName : 참조 대상

  ▷ l-value 참조변수 사용의 예

int a = 10, b = 20;
int &aRef = a;  //참조는 이렇게 초기화하는 형태로만 가능하다.
cout << aRef << endl;
aRef = 100;  // a = 100;
aRef = b;  //b를 참조하라는 뜻이 아니라 b의 값을 aRef가 가리키는 a에 대입하라는 뜻이다. 
             // a = b;

포인터를 이용한 경우와 비교! 같은 코드~

포인터만 사용하는 것보다 참조 변수 사용하는 게 더 심플한 경우이다.

 

   const 참조

   참조를 이용하여 참조 대상의 값을 바꿀 수 없다.

int x { 10 };
const int &xRef = x;
cout << xRef << endl;  //x의 값을 읽어 출력한다
xRef += 10;  // 오류: const 참조로 값을 수정할 수 없다

   참조 변수가 포인터와 다른 점

  • 참조 변수를 이용하여 값을 읽거나 저장할 때 일반 변수를 사용하는 형식과 동일하다
  • 참조 변수는 초기화를 통해 반드시 어떤 대상을 참조해야 한다 (아무것도 참조하지 않는 상황은 발생하지 않는다)
  • 참조 변수는 초기화를 통해 지정된 참조 대상을 바꿀 수 없어 참조의 유효기간 동안 하나의 대상만 참조할 수 있다

  ▷ const 참조를 이용하여 참조 대상의 값을 바꿀 수 없다.

 

 ●  r-value 참조

  ▷ 사용한 후에는 그 값을 더 이상 가지고 잇을 필요가 없는 대상을 참조한다

  ▶r-value 참조의 용도
     객체의 값을 다른 객체로 이동하는 것이다

 

728x90
반응형