사자자리
[C++] 포인터 / new와 delete 연산자 본문
포인터(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;
}
'C++ > C++ 이론' 카테고리의 다른 글
[C++] 조건문 if, switch / 논리연산자 (0) | 2022.07.27 |
---|---|
[C++] 반복문 for, while, do while (0) | 2022.07.27 |
[C++] 구조체(struct) / 공용체(union) / 열거체(enum) (0) | 2022.07.16 |
[C++] 배열 / 문자열(char, string) (0) | 2022.07.16 |
[C++] 데이터형 변환 (0) | 2022.07.13 |
Comments