반응형
포인터(Pointer)
- 프로그램이 변수를 인스턴스화 할때 사용 가능한 메모리 주소가 변수에 자동으로 할당되고, 변수에 할당된 값은 이 메모리 주소에 저장된다.
int x;
- CPU가 위 문장을 실행하면 RAM의 메모리 조각이 따로 설정됨.
예를 들어 변수 x에 메모리 위치 140이 할당 되었다고 가정하면, 프로그램에서 변수 x를 표현식 또는 명령문으로 접근할 때마다 값을 얻으려면 메모리 위치 140을 찾아야함.
변수의 좋은 점은 우리가 어떤 특정한 메모리 주소가 할당되는지 걱정할 필요가 없다는 것이다.
지정된 변수를 참조하면 컴파일러에서 이 이름이 할당된 메모리 주소로 반환한다.
주소 연산자(&) (The address-of operator(&))
주소 연산자 &를 사용하면 변수에 할당된 메모리 주소를 확인할 수있다.
#include <iostream>
int main()
{
int x=5;
cout<<x<<endl;
cout<<&x<<endl;
return 0;
}
역참조 연산자(*) (The dereference operator(*))
- 변수의 주소를 얻는 것 자체로는 그다지 유용하지 않다.
- 역참조 연산자(*)를 사용하면 특정 주소에서 값에 접근할 수있다.
int main()
{
int x = 5;
std::cout << x << '\n'; // print the value of variable x
std::cout << &x << '\n'; // print the memory address of variable x
std::cout << *&x << '\n'; /// print the value at the memory address of variable x
return 0;
}
// prints:
// 5
// 0027FEA0
// 5
역참조 연산자(*)는 곱셈 연사자처럼 보이지만, 역참조 연산자는 단항이고 곱셈 연산자는 이항 연산자이다.
포인터(Pointer)
- 포인터는 어떠한 값을 저장하는게 아닌 메모리 주소를 저장하는 변수이다.
- C++에서 가장 혼란스러운 부분이라고 생각X -> 매우간단하다.
포인터 선언
포인터 변수는 일반 변수처럼 선언되며, 자료형과 변수 이름사이에 별포(*)가 붙는다.
- 자료형* 포인터 이름;
int* iPtr; // int형 포인터
double* dPtr; // double형 포인터
int* iPtr2, *iPtr3; // int형 두 개의 포인터 선언
- 여러 포인터 변수를 선언하는 경우 별표가 각 변수에 포함되어야한다. 초기화 하지않으면 쓰레기 값
포인터에 값 할당(Assingning a value to a pointer)
- 포인터는 메모리 주소만 저장하므로, 포인터에 값을 할당할 때 그 값은 주소여야한다.
- 포인터로 하는 가장 흔한 작업은 다른 변수의 주소를 저장하는 것이다.
int value = 5;
int *ptr = &value; // 변수값의 주소로 ptr 초기화
double *dPtr = 0x0012FF7C; // not okay (정수 리터럴을 할당하는 것으로 취급된다.)
the address-of operator returns a pointer
- 주소 연산자 &는 피연산자의 주소를 리터럴로 반환하지 않는다.
- 대신 피연사자의 주소가 들어있는 포인터를 반환하다.
Dereferencing pointers
- 어떤 것을 가리키는 포인터변수가 있다면, 역참조 변환자(*) 를 통해 포인터가 가리키는 주소의 값을 알 수 있다.
int value = 5;
std::cout << &value; // value의 주소를 출력한다.
std::cout << value; // value의 값을 출력한다.
int *ptr = &value; // ptr은 value를 가리킨다.
std::cout << ptr; // ptr이 가리키는 주소를 출력한다. (=&value)
std::cout << *ptr; // ptr을 역참조한다. (ptr이 가리키는 주소의 값을 출력한다. =value)
// 0012FF7C
// 5
// 0012FF7C
// 5
- 이러한 이유(주소의 값을 알아내는 것) 때문에 반드시 자료형을 가져야한다. 자료형이 없으면 역참조 시 가리키는 내용을 해석하는 방법을 알지 못함.
- *ptr은 변수이므로 다른 변수를 할당 가능하다.
int value =5;
int *ptr= &value;
*ptr= 7; //가능
요약(Summary)
- 포인터는 메모리 주소를 저장하는 변수이다.
- *를 사용하여 저장한 메모리의 주소의 값을 알 수있다.
- 가비지 포인터를 역참조하면 응용 프로그램이 종료될 수있다.
반응형
'C++' 카테고리의 다른 글
[C++] char 문자열 (기본, char[] 와 char* 의 차이점 등) (0) | 2020.09.24 |
---|---|
Visual Studio 2015 - 자주 사용하는 단축키 (0) | 2020.08.19 |
[C++] 스택과 힙 (0) | 2020.07.23 |
[C++] 메모리누수 체크 (0) | 2020.07.23 |
[C++] char[] 와 char*의 차이 (0) | 2020.07.22 |