포인터
포인터는 변수의 주소를 저장하는 데 사용됩니다.
구문
Type *pointer;
초기화
Type *pointer; Pointer = variable name;
함수
- 포인터는 변수의 주소를 저장하는 데 사용됩니다.
- 포인터에는 null 값이 할당될 수 있습니다.
- 포인터는 참조로 전달될 수 있습니다.
- 포인터는 스택에 자체 메모리 주소와 크기를 갖습니다.
예시
#include <iostream> using namespace std; int main() { // A normal integer variable int a = 7; // A pointer variable that holds address of a. int *p = &a; // Value stored is value of variable "a" cout<<"Value of Variable : "<<*p<<endl; // It will print the address of the variable "a" cout<<"Address of Variable : "<<p<<endl; // reassign the value. *p = 6; cout<<"Value of the variable is now: "<<*p<<endl; return 0; }
출력
Value of Variable : 7 Address of Variable : 0x6ffe34 Value of the variable is now: 6
C++의 스마트 포인터
스마트 포인터는 파일 처리, 네트워크 소켓 등과 같은 메모리 관리로 사용할 수 있는 방식으로 일반 포인터를 만들 수 있는 추상 데이터 유형입니다. 또한 자동 소멸, 참조 카운팅 등과 같은 많은 작업을 수행할 수 있습니다.
C++의 스마트 포인터는 * 및 -> 연산자로 오버로드된 템플릿 클래스로 구현할 수 있습니다. auto_ptr, shared_ptr, unique_ptr 및 weak_ptr은 C++ 라이브러리에서 구현할 수 있는 스마트 포인터의 형태입니다.
예시
#include<iostream> using namespace std; // A generic smart pointer class template <class T> class Smartpointer { T *p; // Actual pointer public: // Constructor Smartpointer(T *ptr = NULL) { p = ptr; } // Destructor ~Smartpointer() { delete(p); } // Overloading dereferencing operator T & operator * () { return *p; } // Overloding arrow operator so that members of T can be accessed // like a pointer T * operator -> () { return p; } }; int main() { Smartpointer<int> p(new int()); *p = 26; cout << "Value is: "<<*p; return 0; }
출력
Value is: 26
C++의 공유 포인터
shared_ptr은 C++ 라이브러리에서 구현할 수 있는 스마트 포인터 형식 중 하나입니다. 원시 포인터와 참조 카운팅(객체, 메모리 블록, 디스크 공간 또는 기타 리소스와 같은 리소스에 대한 참조, 포인터 또는 핸들의 수를 저장하는 기술)에 포함된 포인터의 소유권 구조의 컨테이너입니다. shared_ptr의 모든 사본과 함께.
포함된 원시 포인터가 참조하는 개체는 모든 복사본이 shared_ptr에서 제거될 때만 파괴됩니다.
예시
#include<iostream> #include<memory> using namespace std; int main() { shared_ptr<int> ptr(new int(7)); shared_ptr<int> ptr1(new int(6)); cout << ptr << endl; cout << ptr1 << endl; // Returns the number of shared_ptr objects // referring to the same managed object. cout << ptr.use_count() << endl; cout << ptr1.use_count() << endl; // Relinquishes ownership of ptr on the object // and pointer becomes NULL ptr.reset(); cout << ptr.get() << endl; cout << ptr1.use_count() << endl; cout << ptr1.get() << endl; return 0; }
출력
0xe80900 0xe80940 1 1 0 1 0xe80940