|
http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&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 : 9056 Date : 2012/01/07 09:01
|