1579, 1/79 회원가입  로그인  
   우느님
   [자작]c언어 <포인터> 캐쉽게 설명해드려요~ 3 (수정)

http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=1918 [복사]


//제 설명에 큰 오류가 있었습니다. 복습할겸 다시 보다가 발견했네요 ㅠ 죄송합니다.
//잘못된 부분은 모두 수정, 삭제 하였습니다.



앞에서 포인터변수의 포인터(주소)를 저장하는 것에 대한 의문을 가져보았습니다.

여기서 그것에 대해 파헤쳐 봅시다.




예제를 봐주세요.

<예제>

int a = 10;

int *ap = &a;

int **app = ≈

int ***appp = &app;

<설명>

int a = 10;

컴퓨터에게 정수 '10'을 저장하고 싶으니 a라는 이름을 붙여 적절한 공간을 만들어달라고 했습니다.

int *ap = &a;

a라는 이름을 가진 공간의 포인터(주소)를 포인터변수ap에 저장했군뇨.


음 그런데 아래를 보니...

int **app = ≈

int ***appp = &app;

이 2문장에 앞에서 이야기하였던 포인터변수의 포인터(주소)를 저장하는 의문에 대한

해답을 제시하였습니다.


< 해답은 다음과 같습니다. >

포인터변수의 포인터(주소)를 저장하기 위해서는 이중포인터변수가 필요합니다.

이중포인터변수 -> ' * ' 2개

이중포인터변수의 포인터(주소)를 저장하기 위해서는 삼중포인터변수가 필요합니다.

삼중포인터변수 -> ' * ' 3개

삼중포인터변수의 포인터(주소)를 저장하기 위해서는 사중포인터변수가 필요합니다.

사중포인터변수 -> ' * ' 4개

삼중,사중,,,n중,,,까지 가는 경우는 거의 없지만 이런것을 '다중포인터'라고 합니다.



위의 예제만 확실히 가지고놀줄 아신다면 여러분은 포인터킹이 될 수 있습니다.

위의 예제를 가지고

다음과 같은 문장들을 생각해보세요.

a        =>    ???

&a       =>   ???

*&a      =>   ???
  
ap       =>   ???

*ap      =>   ???

&ap     =>   ???

*&ap    =>   ???

**&ap   =>  ???
  
app      =>  ???

*app    =>  ???

**app   =>   ???

&app    =>   ???

*&app   =>   ???

**&app  =>   ???

***&app  =>   ???

위의 문장들이 어떤값을 의미할지 확실하게 대답할수 있다면

포인터공부는 거의 완벽하다 볼 수 있습니다.


위 문장들에 대한 해설을 제시하기 위해 제가 쓰는 방법을 통해 설명해드리겠습니다.

아, 그리고 설명에 앞서 포인터(주소)는 임의로 쉬운 숫자로 정해서 설명할게여 ~

< 설명시작합니다. >

우선, 지상 1층부터 높이 솟구친 무한한 아파트를 생각하십시오.

그리고 다음과 같이 제일 아래층인 1층부터 아파트 호실을 배정하십시오.

n층
-
-
4층=>***appp         주소 : 400  , 사는놈 : 300
3층=>**app            주소 : 300  , 사는놈 : 200
2층=>*ap               주소 : 200  , 사는놈 : 100
1층=> a                 주소 : 100  , 사는놈 : 10

이제 비교 해보세요.

int a = 10;
int *ap = &a;
int **app = ≈
int ***appp = &app;

뭔가 와닿는게 없나요?

없어도 상관없습니다.



이제 말해둘게 있습니다.

왼쪽에서 오른쪽 순서로 보십시오.

*&a 라고 되어있으면 a가 가리키는 곳이 어딘지 생각하세요. 그리고 그 곳의 주소를 생각하세요.
(단, a가 포인터변수일 경우에만 성립합니다.)

즉,

' * '가 붙어있으면 그 주소에 사는놈이라고 해석하십시오.

' & ' 가 붙어잇으면 주소를 나타내는 것이라고 해석하십시오.



이제 제가 제시한 문제들을 풀어보죠.

a        =>    10입니다.

&a       =>   100입니다.
a의 주소는 100입니다.

*&a      =>   10입니다.
a가 가리키는 곳은 자신을 가리키고있습니다.
그곳의 주소는 100이네요.
이건 이렇게 생각하면 안됩니다. 위에서 말했다 싶이 a가 포인터변수일경우에만 성립합니다.
이것은 a의 주소에 사는놈이라고 해석해야 합니다. 그러므로 10이 정답입니다.
  
ap       =>   100입니다.
ap에 저장되어있는 것(사는놈)은 100이네요.

*ap      =>   10입니다.
ap에는 포인터(주소) 100이 저장되어 있습니다.
*ap는 저장된 주소에 사는놈을 나타내는군뇨.
연상해놓은 아파트를 보니 주소:100에 사는놈은 10이네요.

&ap     =>   200입니다.
ap의 포인터(주소)를 나타내네요.
아파트를 보니 주소가 200이네요.

*&ap    =>   100입니다.
ap가 가리키는 곳은 a입니다.
그곳의 주소는 100이네요.

**&ap   =>  10입니다.
ap가 가리키는 곳은 a입니다.
그곳의 주소는 100이네요.
주소 100에 사는놈은 10이군요.

이런식으로 게속 풀어보면

app      =>  200입니다.

*app    =>  100입니다.

**app   => 10입니다.

&app    =>   300입니다.

*&app   =>   200입니다.

**&app  =>   100입니다.

***&app  =>   10입니다.

이렇게 됩니다.


<정리>

주소연산자('&') 는 포인터(주소)를 나타낸다.
참조연산자('*') 는 포인터(주소)에 저장된 값(사는놈)을 나타낸다.

  Hit : 5223     Date : 2012/01/07 09:01
[불법/스팸글로 신고하기]



    
akskdlfk18 왠지 친하게 지내고 싶어요.... 제자 안키우시나요 ㅎㅎ 2012/01/08  
havu 쉽게 잘 설명하셨네요.....
몇년전 처음 공부할때 포인터에서 포기했던게 생각나는군요
2012/01/08  
우느님 읽어주셔서 감사합니다.
저도 아직 배울게 많습니다.
제자를 가르칠 정도의 그릇은 안됩니다.
2012/01/09  
kisang0365 잘봤습니다 ㅎㅎ 이걸 기말전에 봤으면 학점좀 잘나왔을텐데 ㅠ 2012/01/09  
lawsoul 좋은정보 감사합니다. 2012/01/14  
dudals3938 와...어렵네요;;;
설명은 쉬운데 마지막부분이 해깔린다 ㅋ
좋은정보 감사해요~
2012/01/23  
우느님 헉 ㅋㅋㅋㅋㅋ 제가 쓴 글에 큰 오류가 ㅋㅋㅋㅋㅋㅋㅋㅋ

*&ap 라는 표현은 ap가 가리키고 있는 곳의 '주소'를 뜻합니다.

*&ap = *ap 가 아니에요....ㅋㅋㅋㅋㅋ.

글 쓸때 헛갈렸었나 봅니다 ㅠ
2012/04/02  
zenis 제자로받아주세요 2012/04/25  
1579     [re] 추가 설명[9]     暴走天使
09/11 8676
1578   부산에서 같이 공부 할 분 있어요?ㅋㅋ[4]     연산동고래
01/16 6548
1577   [자작] C언어 War Game Release 04.01 < Solution > 10진수      우느님
04/12 5721
1576   [자작] C언어 War Game Release 04.01 < 상금 : 50000원 >[11]     우느님
04/01 5606
1575   [자작] C언어 War Game Release 04.01 < Solution > 16진수     우느님
04/11 5366
  [자작]c언어 <포인터> 캐쉽게 설명해드려요~ 3 (수정)[8]     우느님
01/07 5222
1573   [자작]c언어 <포인터> 캐쉽게 설명해드려요~ 2[5]     우느님
01/07 5211
1572   [자작]적절한 네트워크 정리[1]     우느님
01/03 5560
1571   [자작]c언어 <포인터> 캐쉽게 설명해드려요~[6]     우느님
01/07 5294
1570   [자작] 왜 Little Endian 인가 ?[6]     우느님
03/09 5469
1569   하드웨어와 소프트웨어...그리고 불가능한일?[16]     아이프리드
01/11 7925
1568   [Project] 전기,전자 상식 및 샤프심으로 전구만들기. - 3[16]     아이프리드
02/03 11071
1567   [Project] 전기,전자 상식 및 샤프심으로 전구만들기. - 2     아이프리드
02/03 8077
1566   [Project] 전기,전자 상식 및 샤프심으로 전구만들기. - 1[11]     아이프리드
02/03 9872
1565   #01 Protel CAD - 서문     아이프리드
11/21 8868
1564   [자작] C언어 변수 이해하기[9]     싫어 내가할꺼야
02/13 7190
1563   C언어로 만든 그래픽 프로그램[11]     승리의박성환
04/22 16536
1562   리눅스 설치 + Windows설치(생초보에게 좋은 강좌)!![3]     승리의박성환
04/15 12705
1561   밑에 제가 올린 API 소스에 대해서.........     승리의박성환
10/02 6974
1560   NET SEND 명령강좌[8]     서덕진
09/23 5367
1 [2][3][4][5][6][7][8][9][10]..[79]

Copyright 1999-2021 Zeroboard / skin by Hackerschool.org / Secure Patch by Hackerschool.org & Wowhacker.com