[완료] 이해가 잘 되지 않는 포인터 놀이.

무나무나의 이미지

이유는 알수 없지만 문득 이게 생각났습니다.

어떤 포인터 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);
-----------------------------------------

이건 왜 안되는 걸까요?
궁금해 미치겠습니다. 가르쳐주세요.. ㅠ.ㅠ

semmal의 이미지

그런 문법은 없으니깐 안되는 것이지요.

임의의 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] 형태를 항상 *(a+b)로 바꿔서 컴파일한다고 생각하세요.
[a]b 형태가 안되는건 윗분말씀대로 C언어 문법에 정의되지 않은 형태이기 때문에 안되는거구요.

세벌의 이미지

p+n 과 n+p 이 것이 같다는 고정관념을 버리신다면...

http://sebul.sarang.net/

jinyeong의 이미지

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?

semmal의 이미지

Quote:

2[arData] 라는 이상해(?) 보이는 코드는 -> *(2+arData)로 잘 바꾸면서..
[arData]2 라는 똑같아(?) 보이는 코드는 -> *(arData+2)로 왜 못바꾸는 것인가가 궁금합니다.

좀 유치하지만...

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 (*)[]로 쓰는건지 등

여러가지 의문점이 들지만 아직 제 실력이 부족하여 모르겠네요.

조금이나마 도움 되셨으면 합니다. ^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.