편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.
최신판 | 당신의 편집 | ||
780번째 줄: | 780번째 줄: | ||
보통 C 프로그래밍을 시작한 초보자가 가장 이해하고 배우기 힘들어하는 부분. <s>터닝포인터</s><ref>취소선을 표시했지만 정말 이 부분에서 C언어를 포기하는 사람들이 급증한다. 과장 조금 보태서 포인터를 완벽하게 이해한다면 C언어를 거의 다 이해했다고 할 수 있을 정도이다.</ref> | 보통 C 프로그래밍을 시작한 초보자가 가장 이해하고 배우기 힘들어하는 부분. <s>터닝포인터</s><ref>취소선을 표시했지만 정말 이 부분에서 C언어를 포기하는 사람들이 급증한다. 과장 조금 보태서 포인터를 완벽하게 이해한다면 C언어를 거의 다 이해했다고 할 수 있을 정도이다.</ref> | ||
먼저 '''포인터'''(Pointer)라는 개념부터 설명하자. 이름에서부터 알 수 | 먼저 '''포인터'''(Pointer)라는 개념부터 설명하자. 이름에서부터 알 수 있듯, 포인터는 '''가리키는 것'''(Point+er)을 의미한다. 다시 말해서, 변수는 변수인데, 화살표처럼 생긴 변수라고 이해하면 된다. | ||
그러면, 우리가 무언가를 가리킬 때 필요한게 무엇인지 잘 생각해보자. 다른 정보는 없어도 그 대상이 위치한 곳이 어딘지를 알아야하지 않을까? 바로 포인터 변수는 자신이 가리키는 대상의 위치, 즉 '''메모리 상의 주소'''를 가지고 있는 변수가 되겠다 | 그러면, 우리가 무언가를 가리킬 때 필요한게 무엇인지 잘 생각해보자. 다른 정보는 없어도 그 대상이 위치한 곳이 어딘지를 알아야하지 않을까? 바로 포인터 변수는 자신이 가리키는 대상의 위치, 즉 '''메모리 상의 주소'''를 가지고 있는 변수가 되겠다. 즉, 포인터 값 그 자체는 내가 가리키는 곳을 의미한다는 것이다. | ||
그렇다면, 포인터 변수를 표기하는 방법을 조금 더 살펴보자. 이 표기법 때문에 많이 헷갈리곤 하는데, 다음 표를 잘 보면서 이해해보자. | 그렇다면, 포인터 변수를 표기하는 방법을 조금 더 살펴보자. 이 표기법 때문에 많이 헷갈리곤 하는데, 다음 표를 잘 보면서 이해해보자. | ||
806번째 줄: | 806번째 줄: | ||
|} | |} | ||
이 부분이 많이 헷갈릴 것이다. 일단 변수를 선언하는 | 이 부분이 많이 헷갈릴 것이다. 일단 변수를 선언하는 것부터가 문제가 될 수 있다. | ||
{| class="wikitable" | {| class="wikitable" | ||
1,077번째 줄: | 1,077번째 줄: | ||
레지스터 eax에 메모리 주소가 들어 있다고 하자. | 레지스터 eax에 메모리 주소가 들어 있다고 하자. | ||
그렇다면 이 eax에 있는 메모리 주소 값을 CPU가 타고 들어가 그 메모리 셀의 값을 ecx 레지스터에 복사하고자 한다면 mov ecx, [eax] 를 사용해야한다. | 그렇다면 이 eax에 있는 메모리 주소 값을 CPU가 타고 들어가 그 메모리 셀의 값을 ecx 레지스터에 복사하고자 한다면 mov ecx, [eax] 를 사용해야한다. | ||
상위언어인 C언어로 표현하자면, int ecx = *eax; | |||
mov ecx, [eax] | mov ecx, [eax] | ||
int ecx = *eax; | int ecx = *eax; | ||
1,083번째 줄: | 1,083번째 줄: | ||
레지스터 eax에 값이 들어 있다고 하자. | 레지스터 eax에 값이 들어 있다고 하자. | ||
그렇다면 이 eax에 있는 값을 ecx 레지스터에 복사하고자 한다면 mov ecx, eax를 사용해야한다. | 그렇다면 이 eax에 있는 값을 ecx 레지스터에 복사하고자 한다면 mov ecx, eax를 사용해야한다. | ||
상위언어인 C언어로 표현하자면, int ecx = eax; | |||
mov ecx, eax | mov ecx, eax | ||
int ecx = eax; | int ecx = eax; | ||
만약 메모리 주소를 CPU가 알고 있어서 메모리 셀에 있는 값에 엑세스를 할 때, 해당 메모리 주소를 레지스터에 저장하고 싶으면 lea edx, [eax] 를 | 만약 메모리 주소를 CPU가 알고 있어서 메모리 셀에 있는 값에 엑세스를 할 때, 해당 메모리 주소를 레지스터에 저장하고 싶으면 lea edx, [eax] 를 사용해야한다. | ||
상위언어인 C언어로 표현하자면, int *edx = &eax; | |||
lea edx, [eax] | lea edx, [eax] | ||
int *edx = &eax; | int *edx = &eax; |