Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[5601] Re:역참조 연산자에 대해..
HS_Soul [janghs1117] 3615 읽음    2006-02-14 13:00
흠... 배열과 포인터의 관계에서...;;
배열은 포인터로 표현이 가능하다는 것을 알고 계실겁니다..
nums[5] = { 1, 2, 3, 4, 5 }; 라는 배열이 있을 경우...
nums 자체는... 그 배열의 시작"주소"를 의미하구요...
nums[0], nums[1] ..... , nums[4] 는.. 그 배열의 원소를 나타내죠..

이걸 포인터형식으로 나타내면...
nums[0] = *(nums+0) = *(nums)
nums[1] = *(nums+1)
nums[2] = *(nums+2)
이런 식이라는 것도.. 알고 계실거라 생각합니다...

여기서 짚고 넘어가야될 부분은... 배열의 이름 자체는.. 그 배열의 주소를 나타낸다는 거죠..
포인터라는 것도.. 그 값은.. 결국 주소값이구요..

...일단은.. 이 정도에서.. 살짝.. 다른 부분을 끌어와서..
포인터의 포인터라는 걸.. 생각해봅니다...

int num = 5;
int *p_num = #
int **p_p_num = &p_num;

요런 내용이 있다고 가정을 하구요...

이걸 살펴보면... 우선.. p_num 이건.. num에 대한 포인터죠..
p_num 에는.. 변수 num의 주소값을 가지고 있죠...
C 언어에서.. 포인터가 가리키고 있는 곳의 값을 나타낼 때.. 역참조연산자('*') 이걸 사용합니다..
p_num 에는.. 변수 num의 주소값..
*p_num 을 했을 경우는.. 변수 num의 주소가 가리키는 곳.. 즉 실제 num의 값 = 5 를 나타내게 됩니다..
(^^;;;..이해가 되시는지...)

이 상태에서.. 이제 포인터의 포인터를 봅시다..
p_p_num 요거는... p_num의 .. 포인터.. 즉 num변수의 포인터의 포인터죠...
이 걸.. 바로 위의 내용과 연결해서 생각해보면...

p_p_num 에는... p_num의 주소값...(p_num의 주소에는... 변수 num을 가리키는 주소가 있죠..)
*p_p_num 을 하면.. p_num의 주소가 가리키는 값.. 즉 변수 num의 주소값.. 을 나타냅니다.
한번더.. 역참조연산자를 붙이면..
**p_p_num 이건... *p_p_num이 가리키는 값... -> 변수 num의 주소가 가리키는 값.. = 5 가 되죠..

충분히 헷갈리기 쉬운 부분인데... 잘 생각해보면 이해하실 수 있을 겁니다...

이부분은.. 간단한 예제를 직접 짜서.. 실행해보시면.. 이해하기가 더 쉬워질 듯 합니다..

이런 내용들을 바탕으로 질문에 대한 답을 생각해보시길...^^;;

1) 배열은 포인터로 표현이 가능합니다... , 배열의 이름은 해당 배열의 주소를 나타냅니다..
int (*ABC)[x] -> "포인터의 배열"이죠... ^^;; 배열을 포인터로 표현이 가능하다고 했으니..
"포인터의 포인터"로 표현도 가능하다는 걸 알 수 있습니다..

그리고.. 배열의 이름은 그 배열의 시작주소를 나타낸다.. ABC -> 자체는 그 배열의 시작주소죠.;;
ABC + 1 을 하게되면.. ABC 배열에서 두번째 원소의 주소... (배열은 항상 0번째부터 시작하니까...)

위에서 포인터의 포인터를 사용해.. 실제 값을 나태내는 부분을 잘 생각해보시면..
왜.. **(ABC+1) 이런 식으로 역참조 연산자가.. 두 개 와야 되는지..알 수 있을겁니다...

2, 3 번 내용은.. 역시.. 위의 내용들을 이해하면 다 알 수 있는 부분이므로 넘어가도록 합니다..

참고로.. 3번에서.. 역참조 연산자를 한 개 넣었을 경우는...
쓰레기값이라기 보다는... 실제 나타내려고한 값의.. 주소값이라는 게.. 더 맞는 표현입니다..
(뭐.. 원하는..출력 결과가 아니라는 것에서.. 쓰레기라고 볼 수도 있는 부분이지만..^^;ㅋ)

그럼 도움이 됐기를...


UnknownBrood 님이 쓰신 글 :
: 포인터를 공부하고 있습니다.
: 역참조 연산자와 배열의 관계에 관한 건데요.
: 공부하면서 약간 궁금한 것이 몇개 생겼습니다.
:
: 1. 2차원 배열 포인터 변수는
: 선언하거나 정의할 때는 int (*ABC)[x]; 라고 표현하면서
: 왜 출력같은 것을 할 때는 printf("%d\n", **(ABC+1)); 이렇게 역참조를 2번이나 써야 하나요?
:
: 2. 역참조연산자랑 역참조연산자2개의 차이는 무엇인가요?
: 1차원과 2차원 포인터변수를 출력시키는데서 달라지는 건 알겠지만,
: 머릿속에서 정리를 할 수가 없네요.
: 차이를 상세히 적어주시면 감사하겠습니다.
:
: 3. 2차원 배열을 2차원 포인터변수로 출력시킬 때
: 꼭 역참조연산자를 2개 집어넣어야 하나요?
: 2차원 배열을 나타내는데 1개를 집어넣으니 쓰레기값이 나오더군요.
: 초기화를 시켰음에도 불구하고 말이죠.
:
: 천천히 답해주셔도 좋습니다.
: 정성스럽게만 답해주시면 감사하겠습니다.
: (제가 써놓고도 횡설수설이네요. 너무 졸려서인가?)

+ -

관련 글 리스트
5600 역참조 연산자에 대해.. UnknownBrood 2512 2006/02/14
5601     Re:역참조 연산자에 대해.. HS_Soul 3615 2006/02/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.