It won't hurt to try

[C++/윈도우프로그래밍응용]13. 포인터 본문

C++/윈도우프로그래밍응용

[C++/윈도우프로그래밍응용]13. 포인터

yongki.doki 2021. 10. 3. 18:28

포인터란?

메모리를 주소로 참조하기 위한 변수

  • 컴퓨터 메모리 주소를 통하여 메모리의 내용에 직접 접근 하기 위해 사용

포인터의 선언

<데이터형>* <변수 이름> ;

예) int* pscore;

     book* pbook;

&연산자

변수의 주소를 계산해주는 주소 연산자

  • 변수 이름 앞에 &를 붙여 주소 계산 가능
  • 추출된 주소는 주소끼리의 연산에 사용되거나 포인터 변수등에 저장할 수 있음

*연산자

주소를 찾아가서 읽고 쓸 수 있는 간접 참조 연산자

  • 포인터 변수의 앞에 사용하여
    포인터 변수에 저장된 주소가 가리키는
    메모리의 위치를 읽고 쓸 수 있음

동적 메모리 할당(Dynamic Memory Allocation)

프로그램이 실행 도중 메모리를 할당받는 것

  • 힙(heap) 메모리 공간
        → 아직 사용하지 않았지만 할당받을 수 있는 메모리 공간
  • 동적 메모리 할당을 이용하여
    힙으로부터 필요한 메모리 공간을 할당받아 사용 가능

동적 메모리 할당의 장점

  • 필요한 만큼 메모리를 할당받아 사용 가능

동적 메모리 할당의 과정

  1. 동적 메모리 할당 요청
    • 프로그램에서 라이브러리나 API등을 활용하여 동적 메모리 할당을 요청함
    • C언어의 경우 → stdlib.h의 malloc() 함수 등으로 동적 메모리 할당 요청 가능
    • C++언어의 경우 → new 연산자를 사용하여 요청
  2. 운영체제(OS)의 메모리 할당 승인
    • 운영체제는 메모리 할당 요청을 받아 검토함
    • 사용가능한 메모리가 존재하는 경우
      → 프로그램에게 사용 가능한 메모리의 구역을 할당함
    • 프로그램은 논리적 메모리 주소를 사용하여
      메모리의 일부 구역 사용(=읽기+쓰기)이 가능해짐
  3. 프로그램에서 메모리 사용
    • 프로그램에서는 메모리를 자유롭게 사용 가능함
      예) 할당받은 메모리에 값을 저장하는 작업
      예) 할당받은 메모리에 저장된 값을 읽어오는 작업
    • 메모리 반납을 수행하기 전까지
      할당 받은 메모리는 다른 프로그램에게 할당되지 않음
  4. 사용한 메모리를 운영체제에게 반납
    • 사용한 메모리를 운영체제에게 반납 필요
    • C언어의 경우 → stdlib.h의 free() 함수 등으로 가능
    • C++언어의 경우 → delete 연산자로 반납 가능
    • 메모리를 반납하지 않으면
      → 운영체제는 메모리를 계속 사용하고 있는 것으로 간주
      → 메모리 누수 현상(memory leak) 발생
    • C/C++ 언어 사용자의 경우
      메모리 누수현상이 발생하지 않도록
      꼼꼼한 메모리 관리(=할당→사용→반납) 구현 필요

new 연산자

운영체제로부터 동적으로 메모리를 할당받는 연산자

  • new 뒤에는 자료형을 적음
  • 동일 자료형으로 여러개 할당받는 경우 → 개수를 적음
  • new 연산자의 연산 결과 = 주소→ 포인터형에 저장
<데이터형>* <변수 이름> = new <데이터형>;
<데이터형>* <변수 이름> = new <데이터형>[<개수>];
#include <iostream>
#include "book.h"
using namespace std;

int main()
{
    Book *pBook = new Book("책1", 10000);
    // 기존방식
    (*pBook).print();
    // -> 연산자를 사용한 방식
    pBook->print();

    delete pBook;

    return 0;
}

delete연산자

운영체제에게 할당받은 메모리를 반납하는 연산자

  • delete 뒤에는 변수 이름을 적음
  • 동일 자료형으로 여러개 할당받은 경우
    → delete와 변수 이름 사이에 []를 적음
delete <변수 이름>;
delete [] <변수 이름>;

this 포인터

함수가 소속되어 실행되고 있는 객체 자체를 가리킴

  • 객체의 주소를 나타내는 키워드이기 때문에 포인터로 분류
  • 객체의 멤버 함수를 정의할 때,
    맴버 변수 및 다른 멤버 함수 참조에 유리
// 멤버변수의 초기화
Book::Book(string name, int price) : title(name), price(price)
{

}
// this포인터를 이용한 멤버변수의 초기화
Book::Book(string name, int price)
{
	this->title = name;
    this->price = price;
}

 

300x250
300x250
Comments