포인터 실습

CJB_ny·2022년 8월 3일
0

C++ 정리

목록 보기
33/95
post-thumbnail

구조체 메모리 ❗

지금 구조체의 멤버변수는 이런식으로 4바이트 씩 증가를 하는 메모리 주소를 가진다.

밑에 int hp, int attack, int defence랑 다를게 없다.

첫번째 버젼


지금 이부분이 사실은

player를 넘겨준게 아니라 temp라는 것을 임시로만들어서

함수에 매개변수로 넘겨주고

호출당한 함수에서는 따로 계산을 한다음에 temp에다가 값을 복사를 하고

최종적으로 temp에 있는 값을 player에다가 넘겨주는 방식으로 동작하는 것이다.

두번쨰 버젼

애는 첫번째 버젼에서 지역변수ret를 만들었던과는 달리

내부적으로 지역변수를 만들지도 않는다.

구조체 끼리의 복사

player = monster;

이게 한줄로 하고있지만 어셈블리를 뜯어보면은

지금 이 상황이다.

얕은 복사

그냥 '=' 대입 연산자를 통해서 대입을 하면

"얕은 복사"가 일어나서 값을 다 복사를 해버린다.

반면 포인터 끼리의 '=' 연산자를 사용을 하면은

포인텨 변수끼리의 "얕은 복사"가 일어나게되어

int* ptr1 = &a;

int* ptr2 = ptr1;

주소값변수명데이터
0x12121212ptr10x34343434
0x10101010ptr20x34343434

이렇게 값의 얕은 복사만 일어나게되여 같은 메모리 주소를 가르키게 된다.

테스트

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의 메모리 주소값은 다르지만 값이 복사가 된다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글