사자자리

[C++] 포인터 / new와 delete 연산자 본문

C++/C++ 이론

[C++] 포인터 / new와 delete 연산자

renne 2022. 7. 16. 10:42

포인터(pointer)

 - 사용할 주소에 이름을 붙인다.

 - 간접 참조 연산자: 

 - 주소 연산자: 

#include <iostream>
using namespace std;
int main() {
    int a = 10;
    int* ptr = &a;

    cout << "a의 값: " << a << "\ta의 주소: " << &a << endl;
    cout << "*ptr의 값: " << *ptr << "\t*ptr의 주소: " << ptr << endl;
    return 0;
}

<실행 결과>
a의 값: 10      a의 주소: 00000057F52FF7B4
*ptr의 값: 10   *ptr의 주소: 00000057F52FF7B4

 

new 연산자

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

 

delete 연산자

 - 사용한 메모리 블록을 다시 메모리 풀로 환수한다.

 - 환수된 메모리는 프로그램의 다른 부분에서 다시 사용될 수 있다.

 - new로 대입한 메모리만 delete로 해제할 수 있다.

 - new[]로 대입한 메모리는 delete[]로 해제한다.

#include <iostream>
using namespace std;
int main() {
    int* ptr = new int;	//4 바이트
    delete ptr;
}
#include <iostream>
using namespace std;
int main() {
    double* p = new double[2];
    p[0] = 0.1;
    p[1] = 0.2;
    
    cout << "Before: p[0] is " << p[0] << endl;
    p += 1; //포인터가 가리키는 데이터형의 바이트 수만큼 증가.
    cout << "After: p[0] is " << p[0] << endl;
    //delete[] p; 에러
    p -= 1; //포인터가 다시 원래 위치를 가리키게 한다.
    delete[] p;
    return 0;
}

<실행 결과>
Before: p[0] is 0.1
After: p[0] is 0.2

 

포인터와 메모리

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main() {
    char animal[20];    //컴파일 시간에 배열의 크기를 결정
    char* p;

    cout << "동물 이름을 입력하십시오: ";
    cin >> animal;

    p = new char[strlen(animal) + 1];   //동적 구조체: 실행 시간에 배열의 크기를 결정
    strcpy(p, animal);  //입력한 동물 이름을 복사

    cout << "입력한 동물 이름: " << animal << "\t주소: " << (int*)animal << endl;
    cout << "복사된 동물 이름: " << p << "\t주소: " << (int*)p << endl;
    return 0;
}

 

구조체 포인터

#include <iostream>
using namespace std;

struct MyStruct {
    char name[20];
    int age;
};

int main() {
    MyStruct* temp = new MyStruct;
    cout << "이름: ";
    cin >> temp->name;	//구조체 포인터 연산자: ->
    cout << "나이: ";
    cin >> (*temp).age;	//구조체 포인터 연산자: (*포인터명).멤버명

    cout << "당신의 이름은 " << temp->name << "이고, " << temp->age << "살입니다.";
    return 0;
}

 

Comments