포인터와 메모리 시뮬레이션
C 코드를 한 줄씩 실행하면서 메모리 칸의 값과 포인터가 가리키는 곳이 어떻게 바뀌는지 봅니다. 배열과 포인터 연산, 값 전달과 주소 전달, 배열 밖에 쓰는 버그까지 네 가지 예제를 돌려 봅니다.
MEMORY시작 전다음 줄을 누르세요
포인터가 가리키는 곳방금 바뀐 칸잘못 덮어쓴 칸
3D 장면을 불러오는 중입니다
조작
코드 노란 줄이 방금 실행한 줄
측정
- 실행한 줄
- 0
- 포인터 값
- -
- 가리키는 변수
- -
- 따라가서 읽은 값
- -
이렇게 해 보세요
- 상자 하나가 메모리 4바이트입니다. 위에는 변수 이름, 아래에는 주소, 가운데에는 지금 들어 있는 값이 적혀 있습니다.
- 다음 줄을 누르면 코드가 한 줄 실행됩니다.
int *p = &a;가 실행되면 p 상자에 a의 주소가 들어가고, 노란 화살표가 p에서 a로 이어집니다. *p = 30;을 실행해 보세요. p 상자는 그대로인데 화살표 끝에 있는 a의 값이 바뀝니다. 별표는 "그 주소로 가서"라는 뜻입니다.- 예제를 배열과 포인터 연산으로 바꾸세요.
p++는 주소에 1이 아니라 4를 더합니다. int 한 칸을 건너뛰기 때문입니다. - 값 전달과 주소 전달에서는 함수가 불릴 때 새 상자가 생깁니다. 값을 넘기면 복사본만 바뀌고, 주소를 넘기면 원본이 바뀝니다.
- 배열 밖에 쓰기를 끝까지 실행하면 반복문이 한 번 더 돌아 배열 바로 옆 변수를 덮어씁니다. C는 이것을 막아 주지 않습니다.
읽는 법
변수는 메모리 어딘가에 자리를 잡고, 그 자리의 번호가 주소입니다. 포인터는 그 번호를 값으로 가지는 변수입니다. p를 읽으면 주소가, *p를 읽으면 그 주소에 있는 값이 나옵니다.
함수의 지역 변수는 호출될 때 스택에 생기고 함수가 끝나면 사라집니다. 이 실험실에서 함수 상자가 나타났다 없어지는 것이 그 모습입니다.
주소는 STM32의 RAM 시작 주소(0x20000000)를 본떠 예시로 붙였습니다. 실제 배치는 컴파일러와 최적화에 따라 달라집니다.
자세한 설명은 포인터 노트와 배열과 문자열 노트에 있습니다.