int number = 1;
int* numAddr = &number;
의 메모리를 보면은
이게 지금 number의 스택메모리 주소값이다.
" 0x000000A831B8F994 "
이안에 지금 0x00000001 이 들어가있음
그러면 포인터를 보도록 하자.
이게지지금 포인터 변수의 스택 메모리 주소값인데
엔디안에따라 값이 거꾸로 있기 때문에
000000a831b8f994 이다.
값으로는
" 000000a831b8f994 "를 들고있다.
주소값 | 변수명 | 값 |
---|---|---|
&number = " 0x000000A831B8F994 " | number | 1 |
&numAddr = " 0x000000A831B8F9B8 " | numAddr | 0x000000a831b8f994 |
즉 포인터 변수는 값으로 number의 주소값을 가르킨다.
또한 운영체제에 따라 포인터 변수의 크기가 달라지는데
32bit -> 4바이트의 크기
64비트 -> 8바이트 크기
그래서 지금 포인터 변수의 값들이 8바이트로 잡힌것이다.
지금 내가 64비트로 실행하기 때문에.
ptr이 지금
주소 | 변수명 | 값 |
---|---|---|
0x000000a123456789 | ptr | 0x000000a212121212 |
이라고치면
*ptr은 주소를 저장하는 변수인 ptr의 값 부분(0x000000a212121212)에 접근해라! 라는 의미이다.
그래서 value = 해당 주소에 접근해서 데이터를 꺼내서 value에 넣어준 것이다.
지금 [ ] 이게 주소에 접근을 하는 것이다.
mov eax, dword ptr [ptr]
ptr의 주소에 접근을 해서 주소를 eax에 복사
[eax] 의 주소에 접근ㅇ 르해서 그 주소갑슬 ecx에 mov한다.
이정도..