• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

클래스 타입의 포인터 질문합니다

23.02.11 20:16 작성 23.02.11 20:20 수정 조회수 379

0

class Knight(){

public:

void GetHp(){

}

}

int main(){

(1) Knight k1

k1.GetHp()

(2) Knght *k1

k1->GetHp()

함수를 호출할 때 멤버 함수 같은 경우 어떤 특정 객체의 주소를 넘겨주는 것까지 포함하고 있는 규약을 따르고 있고 마치 포인터와 유사하듯이 k1의 주소 즉 Knight의 스택 주소를 넘겨줘서 멤버 함수 내부에서 자기 자신의 정보를 수정할 수 있다고 알고 있습니다 .

k1이 포인터 타입일 경우와 아닐 경우 둘 다 Knight의 주소를 담고 있지만 큰 차이점으로는 k1은 Knight의 스택 주소를 갖고 있고, 그 스택 영역이 끝나면 k1으로 더 이상 Knight의 접근할 수 없고

*k1은 Knight의 힙 영역에 주소를 갖고 있는 것이 큰 차이점이라고 보면 될까요?

int a=1 int *b=&a

그리고 포인터는 b의 변수에 a의 주소를 갖고 있고 그 주소를 타고 가면 int타입이 있을 것이라고 했는데 Knight *k1는 k1의 어떤 주소가 담겨 있는데 그 주소로 가면 Knight 타입이 있다는 의미인데 k1의 어떤 주소를 갖고 있는지 명시하지 않아도 Knight의 주소를 갖고 있을 것이라고 어떻게 아는 것일까요?

 

답변 1

답변을 작성해보세요.

1

k1.GetHp()와 k1->GetHp()
의 차이는 크지 않습니다.

멤버 함수는 기본적으로 GetHp를 호출할 때
객체의 주소를 첫 번째 인자 (혹은 레지스터)에 넣게 됩니다.
실제로 해당 부분에 Breakpoint를 걸고 어셈으로 살펴보시기 바랍니다.
느낌적으로 GetHp(k1의주소, ...) 이런 식으로 동작합니다.