출처 : https://www.instagram.com/programmer.meme/p/CysHW-4LgLL/
포인터는 메모리 주소를 저장하는 변수
포인터 = 주소를 저장하는 바구니
포인터를 사용하는 이유는 전역변수를 사용하지 않더라도 지역변수에 포인터를 사용함으로써 메모리 주소를 이용해 데이터를 변경 할 수 있기 때문이다.
void SetHp(int* hp) {
*hp = 100;
}
int main() {
int hp = 1;
SetHp(&hp);
}
number = 1라 함은, number 바구니에 1이라는 숫자를 넣으라는 의미이다.
따라서 스택 메모리에 있는 특정 주소(number 바구니)에 우리가 원하는 값을 넣은 셈
number는 비유하자면 메모리에 이름을 붙인 것 (찰떡 같이 알아들어서 변환해 주는것)나쁘지 않고 편리한 장점이 있지만 단점은 원본 수정이 힘들다는 점이다.
TYPE* 변수이름
*의 의미 : 1. 바구니 라고 명시, 2. 넘겨준 주소로 넘어가라
포인터 = 주소를 저장하는 바구니
변수를 선언할 때 *이 등장했다. -> 포인터 = 주소
메모리의 주소를 알아야지만 값의 변경이나 읽는 것이 가능하다.
//&의 주소를 꺼내서 ptr에 대입해주세요
// 포인터는 32비트 os일시 4바이트, 64비트일스 8바이트 고정이다.
// 스택에 있는 ptr이라는 바구니에 number의 주소를 넣어줘
int number = 1;
int* ptr = &number;
포인터를 통해 값을 변경하는 것이 가능하다.
int value1 = *ptr;
*ptr = 2;
cout << number;
//결과 : 2
Type을 적어주는 이유는 주소를 찾아 갔을때 어떤 Type의 데이터가 있는지 알려주기 위함
문제가 없을 수도 있지만 다른 중요한 데이터가 저장돼있는 주소를 해칠 수 있음
__int64* ptr2 = (__int64*)&number;
*ptr2 = 0xAABBCCDDEEFF;
포인터를 이용해서 주소를 잘못 입력했을시 해당 주소를 넘어서 사용하게 되면 데이터를 덮어 쓸 수 있는 문제가 발생 할 수 있다.
Are you Otaku?