시리즈:쉽게 배우는 프로그래밍 입문/C 편집하기

편집하면 당신의 IP 주소가 공개적으로 기록됩니다. 계정을 만들고 로그인하면 편집 시 사용자 이름만 보이며, 위키 이용에 여러 가지 편의가 주어집니다.

편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.

최신판 당신의 편집
780번째 줄: 780번째 줄:
보통 C 프로그래밍을 시작한 초보자가 가장 이해하고 배우기 힘들어하는 부분. <s>터닝포인터</s><ref>취소선을 표시했지만 정말 이 부분에서 C언어를 포기하는 사람들이 급증한다. 과장 조금 보태서 포인터를 완벽하게 이해한다면 C언어를 거의 다 이해했다고 할 수 있을 정도이다.</ref>
보통 C 프로그래밍을 시작한 초보자가 가장 이해하고 배우기 힘들어하는 부분. <s>터닝포인터</s><ref>취소선을 표시했지만 정말 이 부분에서 C언어를 포기하는 사람들이 급증한다. 과장 조금 보태서 포인터를 완벽하게 이해한다면 C언어를 거의 다 이해했다고 할 수 있을 정도이다.</ref>


먼저 '''포인터'''(Pointer)라는 개념부터 설명하자. 이름에서부터 알 수 있듯이, 포인터는 '''가리키는 것'''(Point+er)을 의미한다. 다시 말해서, 변수는 변수인데, 화살표처럼 생긴 변수라고 이해하면 된다. 복잡하다면 그냥 변수의 메모리의 주소를 저장하는 상자(주소록)라고 생각해주자.
먼저 '''포인터'''(Pointer)라는 개념부터 설명하자. 이름에서부터 알 수 있듯, 포인터는 '''가리키는 것'''(Point+er)을 의미한다. 다시 말해서, 변수는 변수인데, 화살표처럼 생긴 변수라고 이해하면 된다.


그러면, 우리가 무언가를 가리킬 때 필요한게 무엇인지 잘 생각해보자. 다른 정보는 없어도 그 대상이 위치한 곳이 어딘지를 알아야하지 않을까? 바로 포인터 변수는 자신이 가리키는 대상의 위치, 즉 '''메모리 상의 주소'''를 가지고 있는 변수가 되겠다. 제어판 하드웨어 관리자에 들어가면 0x00000어쩌고 써있는 걸 본적이 있을 것이다. 그게 바로 메모리 주소다. 즉, 포인터 값 그 자체는 내가 가리키는 주소를 의미한다는 것이다.
그러면, 우리가 무언가를 가리킬 때 필요한게 무엇인지 잘 생각해보자. 다른 정보는 없어도 그 대상이 위치한 곳이 어딘지를 알아야하지 않을까? 바로 포인터 변수는 자신이 가리키는 대상의 위치, 즉 '''메모리 상의 주소'''를 가지고 있는 변수가 되겠다. 즉, 포인터 값 그 자체는 내가 가리키는 곳을 의미한다는 것이다.


그렇다면, 포인터 변수를 표기하는 방법을 조금 더 살펴보자. 이 표기법 때문에 많이 헷갈리곤 하는데, 다음 표를 잘 보면서 이해해보자.
그렇다면, 포인터 변수를 표기하는 방법을 조금 더 살펴보자. 이 표기법 때문에 많이 헷갈리곤 하는데, 다음 표를 잘 보면서 이해해보자.
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;
상위언어인 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;
상위언어인 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;
상위언어인 C언어로 표현하자면, int *edx = &eax;
lea edx, [eax]
lea edx, [eax]
int *edx = &eax;
int *edx = &eax;
리브레 위키에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 3.0 라이선스로 배포됩니다(자세한 내용에 대해서는 리브레 위키:저작권 문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
글이 직접 작성되었거나 호환되는 라이선스인지 확인해주세요. 리그베다 위키, 나무위키, 오리위키, 구스위키, 디시위키 및 CCL 미적용 사이트 등에서 글을 가져오실 때는 본인이 문서의 유일한 기여자여야 하고, 만약 본인이 문서의 유일한 기여자라는 증거가 없다면 그 문서는 불시에 삭제될 수 있습니다.
취소 편집 도움말 (새 창에서 열림)

| () [] [[]] {{}} {{{}}} · <!-- --> · [[분류:]] · [[파일:]] · [[미디어:]] · #넘겨주기 [[]] · {{ㅊ|}} · <onlyinclude></onlyinclude> · <includeonly></includeonly> · <noinclude></noinclude> · <br /> · <ref></ref> · {{각주}} · {|class="wikitable" · |- · rowspan=""| · colspan=""| · |}

이 문서는 다음의 숨은 분류 1개에 속해 있습니다: