Pointer #1

Kimbab1004·2024년 2월 4일
0

CPP

목록 보기
1/27

포인터란 무엇일까?


출처 : https://www.instagram.com/programmer.meme/p/CysHW-4LgLL/

포인터는 메모리 주소를 저장하는 변수

포인터 = 주소를 저장하는 바구니

포인터를 사용하는 이유

포인터를 사용하는 이유는 전역변수를 사용하지 않더라도 지역변수에 포인터를 사용함으로써 메모리 주소를 이용해 데이터를 변경 할 수 있기 때문이다.

void SetHp(int* hp) {
	*hp = 100;
}
int main() {

	int hp = 1;
	SetHp(&hp);

}

포인터를 사용하기전 방식

  1. number 라는 이름의 4바이트 정수 타입의 바구니를 만든다.
  2. number 라는 변수 스택 메모리에 할당

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

포인터의 크기는?

  • = 포인터의 의미 = 주소를 저장하는 바구니 4/8바이트 고정 크기 OS에 따라 다르다.
    4/8바이트 고정이라면서 왜 굳이 int와 같이 Type 선언을 해주는 거야?

Type을 적어주는 이유는 주소를 찾아 갔을때 어떤 Type의 데이터가 있는지 알려주기 위함

문제가 없을 수도 있지만 다른 중요한 데이터가 저장돼있는 주소를 해칠 수 있음

__int64* ptr2 = (__int64*)&number;

*ptr2 = 0xAABBCCDDEEFF;

포인터를 이용해서 주소를 잘못 입력했을시 해당 주소를 넘어서 사용하게 되면 데이터를 덮어 쓸 수 있는 문제가 발생 할 수 있다.

https://github.com/LeeGiSeung/CPP/tree/main/Pointer

1개의 댓글

comment-user-thumbnail
2024년 2월 5일

Are you Otaku?

답글 달기