Introduce
Struct(구조체)를 이용해 포인터를 사용했을때와 사용하지 않았을때의 차이점을 살펴본다.
[구조체 선언]
#include <iostream>
using namespace std;
struct Statinfo
{
int hp; // 4바이트 변수 3개 == 12바이트 짜리 구조체
int attack;
int defence;
};
[포인터를 사용하지 않은 경우]
Statinfo CreatePlayer()
{
Statinfo ret;
cout << "Player Created" << endl;
ret.hp = 100;
ret.attack = 10;
ret.defence = 2;
return ret;
}
int main()
{
Statinfo player;
player.hp = 0;
player.attack = 0;
player.defence = 0;
player = CreatePlayer();
}
Statinfo 타입의 ret 지역변수를 하나 만들어서 return 해준다. 즉, 원본을 건드리지 않고, 복사를 해 건드린다.
= 자세한 스택 프레임 구조 =
time 1 : [매개변수][RET][지역변수(temp, player(000))] [매개변수(&temp)][RET][지역변수ret(100,10,2)] ~
time 2 : [매개변수][RET][지역변수(temp(100,10,2), player(000))] [매개변수(&temp)][RET][지역변수ret(100,10,2)] ~
time 3 : [매개변수][RET][지역변수(temp(100,10,2), player(100,10,2))] [매개변수(&temp)][RET][지역변 ret(100,10,2)] ~
즉, temp를 하나 만든 후 값을 채워놓고, 그 다음 temp의 내용을 player에 복사하는 방식 >> 생각보다 복잡하죠?
[포인터를 사용한 경우]
void CreateMonster(Statinfo *info)
{
cout << "Monster Created" << endl;
info->hp = 40;
info->attack = 10;
info->defence = 2;
}
int main()
{
Statinfo monster;
monster.hp = 0;
monster.attack = 0;
monster.defence = 0;
CreateMonster(&monster);
}
이제는 temp를 만들지 않고 바로 monster의 주소를 넘겨받아서 작업한다.
= 자세한 스택 프레임 구조 =
time 1 : [매개변수][RET][지역변수(monster(000))] [매개변수(&monster)][RET][지역변수] ~
time 2 : [매개변수][RET][지역변수(monster(40,10,2))] [매개변수(&monster)][RET][지역변수] ~
'Language > C++' 카테고리의 다른 글
[C++] OOP(객체지향)의 개념 (0) | 2022.06.06 |
---|---|
[C++] 참조 (0) | 2022.06.05 |
[C++] 포인터 (0) | 2022.06.05 |
[C++] 메모리 구조 (0) | 2022.06.05 |
[C++] 기본구성요소와 문자열 (0) | 2022.06.05 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!