포인터 이해(1)

rgbi3307의 이미지

#include /stdio.h/

int main (void)
{
int a;
int *b;
int **c;
int ***d;

b = &a;
c = &b;
d = &c;

a = 1;
*b = 2;
**c = 3;
***d = 4;

printf ("a=%d, *b=%d, **c=%d, ***d=%d\n", a, *b, **c, ***d);

return 0;
}

printf() 함수의 출력은 어떻게 될까요?

From:
*알지비 (메신저: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.kr/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

lysgenius의 이미지


**c = *(*(c)) 인가요?
c = &b 이면?
*c는 b를 가리키고?
*c의 값은 b주소에 있는 값?
*(*c)는 b의 값에 대응 하는 주소를 가리키는건가요?

앍 어려워 ㅠㅠ 좀더 공부해야 할듯요 ㅎㅎ..뭐 하나 확신이 드는게 없네요.

kevin0960의 이미지

* 의 우선 순위가 오른쪽 이므로 **c = *(*c) 가 맞을 것 같네요

--------------------------------------
2b or not 2b, that is the question

Fe.head의 이미지

모두 4가 출력되지 않나요?

-----------------------
과거를 알고 싶거든 오늘의 네 모습을 보아라. 그것이 과거의 너니라.
그리고 내일을 알고 싶으냐? 그러면 오늘의 너를 보아라. 그것이 바로 미래의 너니라.
-----------------------
내가 쓰는 글은 틀릴 수 있습니다.

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

rgbi3307의 이미지

모두 4가 출력이 됩니다.
포인터 개념이 자꾸 헤갈려서, 제가 직접 코딩해 본 것입니다.

왜 모두 4가 출력이 되는지, 설명을 할려니, 또 머리에 쥐가 나는군요(^^).
그래서 요즘은, 포인터에 포인터에 포인터... 이런것들은 아예 그림을 그려서 이해합니다.
온라인 특성상, 그림을 그려드릴 수는 없고, 다만, 포인터에서 중요한 개념은
&은 주소연산자(주소 가져옴)
*은 주소참조연산자(주소안의 내용을 가져옴) 입니다.

*은 주소안의 내용을 가져옴.(주소참조1개)
**은 주소의 주소안의 내용을 가져옴.(주소참조2개)
***은 주소의 주소의 주소안의 내용을 가져옴.(주소참조3개)
****은 주소의 주소의 주소의 주소안의 내용을 가져옴(주소참조4개)
*****은 ...

결론은, *가 붙은 개수만큼 주소참조가 이루어 진다는...

From:
*알지비 (메신저: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.kr/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

semmal의 이미지

자기자랑일 수도 있지만 과거에 저는 포인터에 대해 딱 한번만에 책을 보고 이해했답니다.

나중에 후배들에게 책에 있는 그대로 포인터를 설명해주는데 아무도 못알아듣더군요.

그제서야 제 머리 어딘가가 다른 사람과 심각할 정도로 다르다는 걸 깨달았습니다.

그런데 그 다른 부분이 좋은 쪽이 아니라 나쁜 쪽인 것 같습니다.

애초부터 제 머리는 정상적인 사고를 하는 두뇌가 아니라 폰 노이만 기계로 뉴런이 연결되어 있었던 것이죠.

나중에 함수형 언어를 접하고 납득하기까지 5년은 훨씬 넘게 걸렸던 것은, SECD머신과 G-머신을 뉴런이 코딩하는데 걸린 시간이었을거라 생각합니다.
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

cppig1995의 이미지

폰 노이만 기계로 뉴런이 연결되어 있었던 것이죠.

공감하고 있습니다.
저는 C++ 처음 접할 때 상속과 가상 함수 개념을 이해하는 데 1년이 걸렸죠.
함수형 언어는... (한숨)

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

winner의 이미지

저는 그런 일 있을 때 눈치도 못채고 넘어간 경우가 많았습니다.

phonon의 이미지

어느 책에서 본 적이 있는데, 기계어가 어려웠던 폰 노이만의 제자가 어셈블러를 만들어 쓰다가 들켰습니다.
스승왈, 이런 아름다운 2진수를 두고 그런 저급한 것을 왜 만들어 쓰냐고 화를 낸 적이 있다고 합니다.

그 분의 머리를 해부하면 CPU와 RAM이 나올려나.

hwiorb의 이미지

그 이야기에 쩔다가 갑니다. -_-켁

nil.

winner의 이미지

제가 아마 '행복한 프로그래밍'인가 '누워서 읽는 알고리즘'인가 거기서 읽었던 거와 표현이 좀 다르네요.

phonon의 이미지

네트워크의 문제로 여러번 올리게 되었습니다.

phonon의 이미지

오랜 전에 읽어서 기억이 가물가물합니다만,
2진수를 사랑하셨다는 얘기는 맞습니다. 아마도.

phonon의 이미지

네트워크의 문제로 여러번 올리게 되었습니다.
토요일 야근 중.

phonon의 이미지

삭제 기능이 없어서 잘못 올린 것을 지울 수가 없네요.
옆 동료가 소스 수정을 해야 실행화일을 만들고 등록을 할 수 있는데,
언제 끝나려나.

phonon의 이미지

기다리기 심심해서 올린 잘못된 댓글 수정을 못해서 이런 내용으로 대체합니다.
토요일에 남자 둘이서 넓은 사무실에 뭣하는 짓인지.휴-
내일은 쉴 수 있으려나.

rgbi3307의 이미지

주소를 같이 해석하고 있습니다.
즉, 포인터는 주소의 한글표현으로 이야기하고 있습니다.

포인터(==주소)를 잘 이해해 보고자, 이런 글을 올리게 되었구요.
(물론, KLDP에서 예전부터 많이 논의 되어 왔겠지만...)

아! 그리고, 주소와 데이터는 완전히 다른것입니다.
TTL 논리회로에서 주소와 데이터는 전류 흐름선이 따로 분리되어 있구요.

From:
*알지비 (메신저: rgbi3307(at)nate.com)
*학창시절 마이크로마우스를 만들었고, 10년동안 IT관련 개발자로 일하고 있음.
*틈틈히 커널연구회(http://www.kernel.kr/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))

From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))