조무위키
조무위키
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
도구
여기를 가리키는 문서
가리키는 글의 최근 바뀜
특수 문서 목록
문서 정보
행위
문서
토론
편집
역사 보기
C언어
편집하기 (부분)
경고:
로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다.
로그인
하거나
계정을 생성하면
편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.
스팸 방지 검사입니다. 이것을 입력하지
마세요
!
===포인터=== ---- {{제작자}} '''포인터는 그 부분만해서 책으로 내놓기도 하고 그만큼 지금까지 배웠던 것 보다는 높은 이해력을 요구한다.''' '''따라서 글을 쓰고있는 작성자도 비약적인 내용을 담을 수 있으며 잘못된 내용이 나올 수 있음을 경고한다.''' '''그러므로 잘못된 부분이 있다면 필히 지적해주길 바람''' 포인터는 C언어의 장점이라 할 수도 있으며, 또한 단점이라고 할 수도 있다. 그 이유는 저수준 접근과 입문자의 인간적 사고를 지녔던 일상과는 달리 컴퓨터 입장에서 봐야하기도 하는 이유 때문이기도 하다. 포인터는 간단하게 설명하자면 주소에 직접 접근하는 것을 일컫는데, 주소를 가리킨다는 의미에서 포인터라 하는 사람도 있다. 여기서 주소란 위에서 설명한 변수의 진짜 이름이라고도 할 수 있는데, 실질적인 메모리 공간의 위치를 주소라 한다. 주소는 4바이트 정수로 표시하는데 (정확히 하자면 unsigned int 즉 부호없는 정수) 대부분 16진수로 표기한다. 예를들어 내가 변수를 선언하였고 이름을 var 이라고 정했다 ( ex - int var; ) 변수는 값을 저장하기 위한 공간이라고 할 수 있는데, 이름을 정하는 이유는 그 공간의 진짜 주소인 메모리 주소를 일일이 기억하기 어렵기 때문이다. 실제로는 0x00000000 이런식의 주소에 저장되어있다. ( 물론 임의로 정한거고 실제는 안 이렇다. ( 절대적인건 아니고 다를 수 있다 codingground 사이트에서는 6바이트의 주소로 나오더라 ) ㄴ 아키텍쳐마다 다름 x86 이면 32bit, x86-64면 64bit 이런식 이걸로 이해가 안가는 사람들을 위해 내가 이해했던 방식으로 설명해준다. 예를 들어 니이름이 강동원이라고치자, 그리고 이글 읽는 너는 분명 급식충이니까 대충 디시중학교 2학년 18반 18번이라고 치자. 그리고 너는 헬조선 학생이라서 맨날천날 학교에 들러붙어서 사는 하이퍼 급식충이다. 그러면 선생님들이 너를 부를때 '야, 강동원이, 느그아부지 뭐하시노'라면서 부를 수도 있지만, '2학년 18반 18번 나와!'라면서 너를 간접적으로 부를수도 있다는 말이다. 그러니까 int name = 강동원 //만약에 문자열을 왜 int형으로 저장하냐는 새끼있으면 머가리 조져버린다. 이라고 선언했을때, 컴퓨터는 자동으로 니놈을 메모리 어딘가의 주소로 보내버린다. 보통은 간지나게 0x000A3같은 16진수로 표현되는데 이 주소에 접근하는거랑 2학년 18반 18번이랑 같은 표현이라는거다. 존나 추상적으로 설명해서 미안하지만, 그건 내가 글을 못써서 그렇다. 미안ㅠ 포인터 변수란것은 그 주소를 보관함으로써 가리키는 변수라고 하는데 간단하게 포인터 변수는 주소를 보관한다고 보면된다. 포인터 변수를 선언하려면 자료형과 이름 사이에 *를 붙이면 되는데. int <nowiki>*</nowiki> ptr; 이라고 선언 가능하다 그리고 이것을 포인터 변수라 하고 좀더 풀어쓰자면 <nowiki>'정수형 변수를 가리키는 포인터 변수 ptr'</nowiki> 이라고 할 수 있다. <nowiki>*</nowiki>이 붙은 모든 포인터 변수의 크기는 보통 4/8byte이며 이유는 주소 크기가 그렇기기 때문이다 cpu 아키텍쳐의 주소 크기를 따라감( double <nowiki>*</nowiki> ptr 도 4byte 라는 얘기) 포인터 변수를 만들었으니 무언가 주소를 보관하고자 한다면 int var; int <nowiki>*</nowiki> ptr = &var; 하면 var 변수의 주소 (ex - 0x00000000)를 ptr이 갖게 되며 이를 가리켰다 라고 표현한다. & 연산자는 옆에 붙은 변수의 주소를 반환한다 (&var = 0x00000000) 그니까 한마디로 ptr에 0x00000000 를 대입한셈! 이제 주소를 갖게 되었으니 한번 그 주소에 접근해보자 int var; int <nowiki>*</nowiki>ptr = &var; <nowiki>*</nowiki>ptr = 3; printf("%d",var); 출력결과는 3이 나올것이다. <nowiki>*</nowiki>ptr = 3; 이 구문은 ptr변수가 갖고있는 주소를 가리키라는 연산자이다. 따라서 갖고있는 주소는 var 변수의 주소이므로 var 변수에 3 대입하는것과 같다! 그러므로 var 변수를 출력하면 3이 나오게 되는 것이다. 왜 쓰는지 궁금할 수도 있는데 이것을 사용하는 이유는 말그대로 변수가 갖고있는 실주소에 접근할 수 있기 때문이다. (다른 이유도 있지만 쉽게 예를 들기 위한 이유이다.) 흔히 포인터에 관해 예를들때 Swap 함수를 만들어보는 예제를 많이들 사용하는데 변수 두개의 값을 바꾸는 Swap 함수를 만들어 본다고 하자. void Swap(int a,int b) { int temp = a; a = b; b = temp; } 이렇게 함수에 인자로 두 변수를 받고 temp에 a변수의 값을 보관하고 a에는 b를 넣고 b에는 a를 보관한 temp를 넣는다. 이렇게 하고 main 함수에서 Swap(var1,var2); 로 호출 했다고 하고 var1 var2를 출력해보면 전혀 안바뀌었는데 이런 이유는 함수 설명에서 알 수 있는데 '''함수의 인자는 값 전달이지 변수 그 자체를 전달하는 것이 아니다''' 함수 정의에서 인자로된 a와 b 변수는 그저 함수의 인자 전달을 위해 만들어진 가짜 변수 이며 매개변수 이기도 하다. (매개변수 뜻을 알면 알 수 있는데 말그대로 매개하는 변수이다.) 이런 이유 때문에 함수 정의부에서 적은 int a,int b 를 '''매개변수'''라 하고 실제로 넘겨준 var1,var2 변수를 '''인자'''라고 단어를 구분짓는 이유기도 하다. 아무튼 이러한 값만 전달하는 특성에 의해 값을 바꾸는 함수 Swap이 제대로 되지 않는다. 여기서 주소에 접근하는 포인터가 있다면 상황은 달라지는데 void Swap(int <nowiki>*</nowiki>a,int <nowiki>*</nowiki>b) { int temp = <nowiki>*</nowiki>a; <nowiki>*</nowiki>a = <nowiki>*</nowiki>b; <nowiki>*</nowiki>b = temp; } 라고하고 호출을 Swap(&var1,&var2); 이렇게 하면 이제 값이 바뀐다! 이유는 잘 이해 했다면 알 수 있는데 여기서 넘겨받은건 값이 아니라 '''주소''' 이며 ( &var1,&var2 ) 함수 내부에서도 <nowiki>*</nowiki>연산자로 a와 b에 보관돈 주소에 접근(가리킴)하여 서로 값을 바꾸었으므로 실제로 그 주소의 공간을 갖고있는 변수인 var1과 var2의 값이 바뀐것이다.
요약:
조무위키에서의 모든 기여는 CC BY-SA 4.0 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는
조무위키:저작권
문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.
저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소
편집 도움말
(새 창에서 열림)