[완료] 이해가 잘 되지 않는 포인터 놀이.
글쓴이: 무나무나 / 작성시간: 금, 2007/11/30 - 12:22오후
이유는 알수 없지만 문득 이게 생각났습니다.
어떤 포인터 p와 정수n 이 있을때 p[n]과 *(p+n)은 일치한다.
int arData[5] = {5, 10, 15, 20, 25}; 이게 있다고 가정한다면
-----------------------------------------
printf("data = %d\n", arData[2]);
printf("data = %d\n", *(arData+2));
-----------------------------------------
이건 성립합니다. 위의 공식에 일치하니까요.
아니 그런데!!!
-----------------------------------------
printf("data = %d\n", 2[arData]);
-----------------------------------------
이것도 성립한다고 합니다.
2[arData]를 알아서 *(2+arData)로 바꿔준다고 하니까요.
아니 그렇다면!!!
-----------------------------------------
printf("data = %d\n", [arData]2);
-----------------------------------------
이건 왜 안되는 걸까요?
궁금해 미치겠습니다. 가르쳐주세요.. ㅠ.ㅠ
Forums:
:)
그런 문법은 없으니깐 안되는 것이지요.
임의의 a,b에 대해서 a[b]라는 문법은 있어도 [a]b라는 문법은 C에 없어요.
다소 엉뚱하기는 해도 이렇게 궁금증이 생기는 건 좋은 겁니다. 힘내세요.
------------------------------
How many legs does a dog have?
------------------------------
How many legs does a dog have?
아직도 이해가 잘 안됩니다..;;
그렇다면 그전에..
2[arData] 이거야 말로 오류가 나야 하는 것이 아닌지요?
정수 2의 arData번째라니.. 이상합니다..;
결국 제가 질문드리고 싶은것은..
2[arData] 라는 이상해(?) 보이는 코드는 -> *(2+arData)로 잘 바꾸면서..
[arData]2 라는 똑같아(?) 보이는 코드는 -> *(arData+2)로 왜 못바꾸는 것인가가 궁금합니다.
흙흙.. ㅜ.ㅜ
할롱~ ^_^)/
C 컴파일러가 a[b]
C 컴파일러가 a[b] 형태를 항상 *(a+b)로 바꿔서 컴파일한다고 생각하세요.
[a]b 형태가 안되는건 윗분말씀대로 C언어 문법에 정의되지 않은 형태이기 때문에 안되는거구요.
p+n 과 n+p 이 것이
p+n 과 n+p 이 것이 같다는 고정관념을 버리신다면...
http://sebul.sarang.net/
세벌 https://sebuls.blogspot.kr/
C compiler가 '못'하는게
C compiler가 '못'하는게 아니라 '안'하는거겠죠.
문법이 그렇게 정의되지 않았으니까요.
아마 yacc grammar로 대략
array: unary '[' unary ']'
정도로 parsing하고 있을것 같습니다.
I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?
우리나라 말로 바꿔볼까요?
좀 유치하지만...
2 => 나
arData => 천재
[ => 는
] => 다
arData[2] => 천재는나다
2[arData] => 나는천재다
[arData]2 => 는천재다나
위의 예제가 좀 사리에 맞지 않기는 하지만...
규칙을 지켜야 의미가 통하기 때문에 그래서 문법인 겁니다.
------------------------------
How many legs does a dog have?
------------------------------
How many legs does a dog have?
정말 멋지십니다.. ㅡ.,ㅡ;;;
한방으로 모든것을 해결하셨습니다.
정말 진심으로 감사드립니다..
아울러 말도안되는 이상한듯한 소리에도 무시하지 않고 설명해주신 모든 분들께도
감사의 말씀을 드립니다.. __);
즐거운 개발 되십시요.. ^^
할롱~ ^_^)/
저도 그게 궁금했어요!
음... 저도 그게 많이 궁금했는데요.
전 또 다른 질문 하나 더 던지고 싶네요.
정말 a[2] == *(a+2) 일까요?
그럼 2차원 int 배열 a[2][3] = *(a + 2*4 + 3) 일까나요..
만약에 이게 맞다면 3[2][a] 가 성립해야 하는데
이게 성립하는게 아니라 2[a][3]이 성립이 되더군요.
조금 더 배열을 확장해도
앞의 두개만 교환 가능하구요.
이런 문법이 왜 적용 되었을까 싶은데...
제 추측이지만 아마도
어셈블리에서 movl %eax, 2(%esp) 이런 식으로 쓰던 사람들이
C언어로 넘어 왔기 때문에 이해의 편의쪽에서 적용 되었던게 아니었을까요?
혹은 MASM으로 오면서 mov [esp+2], eax 이런 식으로 되어서 a[2] 이런식의 방법이 추가 되었던가...
아님 두개 모두를 위해서라 던가...
대략 그런 추측을 하고 있습니다. ㅋ;
이미 저보다 오래 산 C언어인지라 모든 걸 다 알지는 못해 윗 분의 답은 못해드리겠네요.
printf 함수가 왜 520개 이상의 숫자를 출력할 때 에러가 나는지, 배열 포인터를 int[]*로 안쓰고 int (*)[]로 쓰는건지 등
여러가지 의문점이 들지만 아직 제 실력이 부족하여 모르겠네요.
조금이나마 도움 되셨으면 합니다. ^^
댓글 달기