C++프로그래밍/C 와 C++ 기초실습

포인터

season97 2024. 9. 17. 20:19
728x90
반응형

※ C / C++을 이미 알고 있으나 개인적인 공부를 위해 포스팅 하는 글이므로

C++에 대한 구체적인 정보를 담고 있지 않습니다.

 

  ▶ 포인터
  ㆍ 일반 변수는 메모리에 이름을 붙힌 것 int num 이라 붙히면 메모리 공간에 num이라는 이름을 붙혀준 것

 

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

  ㆍ 포인터 선언 방법 TYPE* 변수이름;

  ㆍ 포인터라 함은 주소를 저장하는 타입   

 

  ㆍ 포인터 바구니는 4바이트(32비트) or 8바이트(64비트) 환경에 따라 고정이다. (자료형 상관없음)

 

#include <iostream>
using namespace std;
int main()
{
	int number = 1;

	int* ptr = &number;

	cout << *ptr;

	return 0;
}

ㆍ 위 코드를 테스트 할 때 메모리 창에 &number을 입력하고 엔터를 치면 주소가 나온다.

 

 

▶ 남의 주소를 가져와서 뭐할건데?

ㆍ [주소를 저장하는 바구니]가 가리키는 주소로 가서 무엇인가를 해라.

ㆍ *변수이름 = 값;

ㆍ 포탈을 타고 순간이동 한다고 생각하자

ㆍ 선언단계 (주소를 저장하는 바구니다!), 사용할 때(포탈을 타고 순간이동)

#include <iostream>
using namespace std;
int main()
{
	int number = 1;
	int* ptr = &number;

	int value1 = *ptr;
	*ptr = 2;
	int value2 = *ptr;
	cout << value1 << endl; //1
	cout << value2 << endl; //2

	return 0;
}

 

포인터 메모리

 


 

포인터는 4바이트(32비트) or 8바이트(64비트) 환경에 따라 고정이다. (자료형 상관없음)

 

     → 그렇다면 굳이 int, char 등등 자료형을 붙히는 이유는?

 

     →  주소만 주면 그게 뭔지 알 수 없기 때문에 얘가 뭔지 알기 위해서

 

     → 해당 주소로 갔을때 자료형이 이거인 기반으로 분석을 해줘 (정수기반인지? 문자기반인지?)

 

몇바이트로 어떻게 해석하느냐에 따라 해석이 달라질 수 있음.

 

 

※ 그럼 타입이 불일치 하면 어떻게될까?

#include <iostream>
using namespace std;
int main()
{
	int number = 1;
	//타입이 불일치 하는 경우
	__int64* ptr2 = (__int64*)&number;
	return 0;
}

ㆍint64니까 8바이트 정수... 메모리확인해서 어쩌구저쩌구..

ㆍ 일단위험하고 안된다는것만 알아두자, 엄청나게 큰 오류가 날 가능성이 있으니 주의

ㄴ> 예를들어 자고일어났더니 플레이어 돈이 1억이있다..뭐 이런거

 

더보기

※ 포인터를 사용할땐 자료형을 맞춰주도록 하자. 몇바이트로 어떻게 해석하느냐에 따라 해석이 달라질 수 있음.

 

 

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


int main()
{
	int hp = 1;
	SetHp(&hp); //hp가 100이됨
}

※ call by ref 예시. 주소를 넘겨서 실제 변수에 영향을 끼쳤다

728x90
반응형