
2023.10.19 TIL
포인터 : 다른 변주나 함수의 주소를 담는 변수
포인터 변수도 쓰레기값이 담겨서 시작
int *pointer1 = nullptr;
string *pointer2 = nullptr;
❗️ 다른 데이터타입의 주소는 담을 수 없다
💡 64bit OS : 포인터의 크기는 8Byte
cout << sizeof(pointer1) << endl; // 8
int num = 0x64;
cout << &num << endl; // 0x61fe14
int *pointer1 = #
cout << pointer1 << endl; // 0x61fe14
cout << *pointer1 << endl; // 0x64
int total = 300;
pointer1 = &total;
cout << pointer1 << endl; // 0x61fe10
cout << *pointer1 << endl; // 300
heap 영역에서 동적으로 메모리를 할당받음
int *pointer = nullptr;
pointer = new int;
cout << pointer << endl; // 0xe81a70
cout << *pointer << endl; // 쓰레기값
*pointer = 20;
cout << *pointer << endl; // 20
delete pointer;
int* pointer = new int[3];
delete[] pointer;
int *pointer = 0x3000;
cout << pointer << endl; // 0x3000
cout << pointer + 1 << endl; // 0x3004
cout << pointer + 2 << endl; // 0x3008
double *pointer = 0x3000;
cout << pointer << endl; // 0x3000
cout << pointer + 1 << endl; // 0x3008
cout << pointer + 2 << endl; // 0x3016
실제로 3000이라는 값을 포인터변수에 담는법 :
int *pointer = reinterpret_cast<int*>(3000);
포인터 뺄셈
int main() {
short** a = 8000;
short** b = 0;
cout << (b - a) << endl; // 1000
return 0;
}
short* 변수의 개수를 반환한다.short* 의 크기는 8이니까주소[index] == *(주소 + index)
const int *pointer; // pointer가 가리키는 int값 변경불가
int *const pointer; // pointer가 가진 주소값 변경불가, 그 주소가 가리키는 값은 변경 가능
const int *const pointer; // pointer가 가라키는 int값과 주소값 변경불가
nullptr로 초기화 → OS를 가리켜 즉시 program crashint sum(int &a, int &b) {
int result = a + b;
a = 200;
a = 100;
cout << a << " " << b << " " << result << endl;
return result;
}
int main()
{
int a = 100;
int b = 200;
int result = sum(a, b);
}
int num = 100;
cout << num << endl;
int &numReference; // 초기화가 안됨. build error!
int &numReference = nullptr; // build error!
int &numReference = num; // num의 주소를 대입하는 것과 같은 기능
numReference = 200;
cout << num << endl; // 200
int num2 = 300;
numReference = num2;
string names[] = {"Mark", "Haechan", "Yuta"};
for (auto &name : names)
cout << name << endl;
→ names의 주소를 공유! name에 값을 복사할 필요가 없다
int sum(int *a, int *b) {
int result = *a + *b;
*a = 200;
*b = 100;
cout << a << " " << b << " " << result << endl;
return result;
}
int main()
{
int a = 100;
int b = 200;
int result = sum(a, b);
}
↔ raw pointer
p1.get() : 포인터 주소를 알려주는 함수p1.reset() : pointer가 가지고 있던 Heap 반납unique pointer의 생성
unique_ptr<int> p1 = make_unique<int>(100);
p1.use_count()p1.reset() : pointer가 가지고 있던 Heap 반납shared_ptr<int> p1(new int(100));
shared_ptr<int> p1 = make_shared<int>(100); // 더 효율적
vector<shared_ptr<int>> vec;
shared_ptr<int> p1(new int(100));
cout << p1.use_count() << endl; // 1
vec.push_back(p1); // p1의 복사본을 vec 변수가 가리킴
cout << p1.use_count() << endl; // 2