지금 구조체의 멤버변수는 이런식으로 4바이트 씩 증가를 하는 메모리 주소를 가진다.
밑에 int hp, int attack, int defence랑 다를게 없다.
지금 이부분이 사실은
player를 넘겨준게 아니라 temp라는 것을 임시로만들어서
함수에 매개변수로 넘겨주고
호출당한 함수에서는 따로 계산을 한다음에 temp에다가 값을 복사를 하고
최종적으로 temp에 있는 값을 player에다가 넘겨주는 방식으로 동작하는 것이다.
애는 첫번째 버젼에서 지역변수ret를 만들었던과는 달리
내부적으로 지역변수를 만들지도 않는다.
player = monster;
이게 한줄로 하고있지만 어셈블리를 뜯어보면은
지금 이 상황이다.
그냥 '=' 대입 연산자를 통해서 대입을 하면
"얕은 복사"가 일어나서 값을 다 복사를 해버린다.
반면 포인터 끼리의 '=' 연산자를 사용을 하면은
포인텨 변수끼리의 "얕은 복사"가 일어나게되어
int* ptr1 = &a;
int* ptr2 = ptr1;
은
주소값 | 변수명 | 데이터 |
---|---|---|
0x12121212 | ptr1 | 0x34343434 |
0x10101010 | ptr2 | 0x34343434 |
이렇게 값의 얕은 복사만 일어나게되여 같은 메모리 주소를 가르키게 된다.
struct Info
{
int hp;
int attack;
};
int main()
{
Info player;
player.hp = 10;
player.attack = 100;
Info monster;
monster.hp = 20;
monster.attack = 200;
player = monster;
return 0;
}
이것은 현재 player의 메모리 주소임
주소로 가면 16진수로 1, 100이 들어가있다.
애는 몬스터의 메모리 주소임 -> 들어가보면 20, 200이 들어가있다.
player = "0x00000048A39AF928"
monster = "0x00000048A39AF948"
이런데
player = monster를 하게되면 얕은 복사가 일어나서
player와 monster의 메모리 주소값은 다르지만 값이 복사가 된다.