※ 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 예시. 주소를 넘겨서 실제 변수에 영향을 끼쳤다
'C++프로그래밍 > C 와 C++ 기초실습' 카테고리의 다른 글
포인터 실습 해보기 (일반return과 포인터를 이용한 원본객체 조정) (0) | 2024.09.17 |
---|---|
포인터 연산 (0) | 2024.09.17 |
스택 프레임과 호출스택 (디버그) (2) | 2024.09.16 |
const와 메모리 구조 (3) | 2024.09.16 |
비트연산과 비트플래그 (1) | 2024.09.16 |