#5 [C++] 포인터

김보민·2023년 3월 19일
0

C++

목록 보기
5/5

C++ : 객체지향 프로그래밍(oop)
<oop의 가장 큰 특징>
: 컴파일 시간(프로그램이 코드를 읽는시간)이 아닌 실행 시간에 어떠한 결정을 내릴 수 있음

  • 배열 생성
    • 재래적 절차적 프로그래밍 : 배열의 크기가 미리 결정(컴파일시간에)
    • 객체지향 프로그래밍 : 배열의 크기를 실행 시간에 결정할 수 있음
  • 포인터 : 사용할 주소에 이름을 붙인다.
    즉, 포인터는 포인터의 이름이 주소를 나타냄
    간접값 연산자, 간접 참조 연산자 * 기호로 나타냄
#include <iostream>
using namespace std;

int main() {
   
    // 포인터 선언 방법
    int *a; //c style
    int* b; //c++ style (어떤 방법도 상관없음)
    int* c, d; //c는 포인터 변수로 선언되고, d는 int형 변수로 선언됨

    return 0;
}

	int a = 6;
    int* b; // 포인터변수 b 선언. b는 그 자체로 주소를 나타냄
    //정수는 수, 포인터는 위치를 나타냄

    b = &a; // b에다가 a의 주소값 넣음

    cout << "a의 값 " << a << endl;
    cout << "*b의 값 " << *b << endl;

    cout << "a의 주소 " << &a << endl;
    cout << "*b의 주소 " << b << endl;

    *b = *b + 1;

    cout << "이제 a의 값은 " << a << endl;
    
    
    /*
    [결과]
    a의 값 6
    *b의 값 6
    a의 주소 00000067FAEFFA64
    *b의 주소 00000067FAEFFA64
    이제 a의 값은 7
    */

new 연산자

new 연산자
어떤 데이터형을 원하는지 new 연산자에게 알려주면,
new 연산자는 그에 알맞은 크기의 메모리 블록을 찾아내고
그 블록의 주소를 리턴함

int* pointer = new int; // int는 4byte (windows 기준)

new int 부분은 int형 데이터를 지정할 수 있는 새로운 메모리가 필요하다고 알려주게 되는 것.
new 연산자는 뒤의 데이터형을 확인하고 몇바이트가 필요한지 계산함
4byte를 저장할 수 있는 메모리 블록을 찾아서 그 주소를 포인터에게 리턴해서 초기화 해줌

delete 연산자

delete 연산자
사용한 메모리를 다시 메로리 폴로 환수
환수된 메모리는 프로그램의 다른 부분이 다시 사용

int* ps = new int; // new를 통해 ps 변수 선언
// 메모리 사용
delete ps;
/* ps에 할당된 메모리를 다시 프로그램에 다른 부분이
이 메모리를 사용할 수 있도록 프로그램에 반환해줌
new를 사용하면 반드시 delete를 사용해주어야 함 */

delete를 사용하는 4가지 규칙
1. new로 대입하지 않은 메모리는 delete로 해제할 수 x
2. 같은 메모리 블록을 연달아 2번 delete로 해제할 수 x
(한 번 선언된 포인터 변수는 delete를 한 번만 해야함)
3. new[ ]로 메모리를 대입할 경우 delete[ ]로 해제한다. (배열)
4. 대괄호([ ])를 사용하지 않았다면 delete도 대괄호를 사용하지 x

0개의 댓글