게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
c/c++에서 포인터란? (1편)
게시물ID : programmer_2116짧은주소 복사하기
작성자 : 콜드이슈
추천 : 3
조회수 : 764회
댓글수 : 6개
등록시간 : 2014/03/25 15:05:46
개강 시즌을 맡이해 깨작깨작 하는 포인터 설명 시리즈입니다.

1.정의 :  어떤 값이 저장된 곳의  [주소]를 가지고 있는 변수(메모리 공간) 입니다.

여기서 주소의 타입은 unsigned int 입니다. 무슨말인가 하면  우리가 쓰는 집주소는 한글로 되어있지만(예: 서울시 콩구 콩동 2222-22) 컴퓨터에서 주소는 보통 숫자로 되어있습니다. (예:12355123)

2.왜 쓰는가?

예로 들어보지요. 

공대생답게 지적인 외모에, 깔끔한 옷차림, 프로그래머답게 셜록 뺨때리를 후려갈기는 추리능력에 다년간의 연애 시뮬레이션으로 단련한 매너와 기품이 배어나오며 당장이라도  P=NP문제의 증명과 내비어-스톡스 방정식의 해법을 칠판에 휘갈겨 증명할듯한 오라를 풍기는 당신은 학교 퀸에게 고백을 받아 사귀던 도중 생일을 맞이하게 됩니다. 
박보영을 닮은 청초한 외모에 당신만 바라보는 순정파인 여자친구는 생일 선물로 이번 "디x블로3 : 똥을 치우는 자" 의 한정판을 구해 당신에게 주려 합니다. 하지만 과제의 압박에서 벗어나지 못하는 당신은 여자친구에게 자취방에다가 가져다 놔 줘 라고 부탁합니다. 
이때 당신은 여자친구를 자기 집으로 어떻게 안내할까요?

1) 집 주소를 알려준다.
2) 집건물  "때어서"  안에 있는 가구며 컴퓨터며 설거지를 못해 널린 접시들 까지 싸그리 "복사"해서  여자친구앞에 가져다 준다.  

1) 번에 비해 2) 번은 많은 문제가 있습니다. 
첫째로 번거롭지요. 일단 집을 통채로 복사해서 넘겨주는거 자체가 엄청난 스케일이고 복잡하고 실제로 가능할지 여부는 그렇다고 쳐도 노력대비 얻는게 없습니다. 
둘째로 어떻게든 복사를 해서 가져다 여자친구에게 집의 복사본을 줬다고 해도 디아블로3 한정판은 여러분의 집에 없습니다. 왜? 복사된 집에 있을태니까요. 
셋째로 당신이 이사를 했습니다. 다음번엔 다시 다른 집을 복사해서 줘야 합니다. 1)번을 따른다면 그냥 변경된 주소만 주면 되지요.

1)번이 여러모로 이점이 많은걸 알 수 있습니다. 

물론 대상이 집채만큼 커다란게 아니고 메모라던지 작은 글귀 정도라면 메모의 위치를 주기보단 그냥 복사해서 주는게 더 빠르겠죠.(있다 설명하겠지만 int, dobule ,char 등의 primitve 타입을 말하는겁니다.) 하지만 메모들이 많이 모인 책 정도만 되도 복사해서 주기보단 그 위치를 주는게 더 빠릅니다.
그밖의 여러 장점은 차차 설명하겠습니다. 
물론 단점도요.

자 이제 여러분이 오유인임을 자각하고 KICK을 해서 현실로 돌아와서..(Non, Rien de rien , Non, Je ne regrette rien~)


3.어떻게 쓰는가?

여러분이 
int x=5;  
라고 적고 컴파일을 하고 실행을 하면 컴퓨터는 int의 크기 만큼의 공간을 메모리에 만듭니다. 그리고 그 메모리 공간 안에 5라는 값을 넣어두지요. 
*int의 크기는 운영체제에 따라 다릅니다. 16비트 운영체ㅔ에선 16bits, 32bit 와 64bit에서는 32bits 입니다.
그리고 그 공간은 주소를 부여받게 되죠. 여러분이 사는 집주소 처럼요. 편의상 @1234 라고 합시다.(@는 주소라는 의미. at이라는 뜻이죠) 

여담으로 여기서 왜 32비트 운영체제는 4GB의 메모리 이상을 사용할 수 없는지의 이유가 나옵니다. 32비트 체제에서는
그 주소는 32비트 단위로 사용되며 결국 2^32*byte=4gb  까지밖에 주소가 나오질 않습니다. 그래서 4gb넘어도 주소로 쓸공간이 모잘라서 쓰질 못하는겁니다. 반대로 64비트는 그만큼 주소를 더 내놓을수 있기에 더 많은 메모리를 쓸 수 있게 됩니다.

아무튼 여러분은 이제 그 주소를 통해 마음것 메모리 공간을 조정할 수 있습니다. 주소를 사용해 보지요.

int* pX= &x;  

다음 문장엔 많은 의미가 있습니다. 차근차근 살펴보죠.

int* :  *가 붙으면 별 붙어서 승급했다는게 아니고 그 타입의 포인터 형이라는 뜻입니다. int도 타입이고 dobule도 타입인거처럼 int*도 타입입니다. 바꿔말함 그 타입의 메모리 공간의 주소를 값으로 가지고 있다는 겁니다. 위에서 케이스에서 @1234 를 가지고 있겠죠?

pX : 포인터 타입도 변수이므로 변수명을 준겁니다.p는 포인터의 약자입니다. 

= : 대입연산자. 끗(equal이 아닙니다? == 요거랑은 달라요)

& :  뒤에 오는 놈의 주소를 알아내는 연산자입니다. 여기선 뒤에 x가 오니깐 x 라는 변수의 주소를 알아내라는 의미겠죠?


위대한 한글로 풀어쓰면  
"int형의 주소를 담을수 있는 int포인터 형식을 가진 이름이 pX이란애를 만들고 그 안에 x란 놈의 주소를 담아라."
결국 pX안에는 x의 메모리 주소인 @1234 가 들어가게 되었습니다. 

자  다음편에는  이놈을 어떻게 써먹을지 더 고찰하겠습니다.
(다음편 커버내용: call by value, call by reference, 포인터의 포인터 )








전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호