[질문] C언어 다음이 어떤 차이가 있는지 궁금합니다.
글쓴이: keston / 작성시간: 목, 2004/09/09 - 4:44오후
int i[]={1,2,3}; for(j=0; j<3; j++) printf("%d\n", *(i+j)); (1) printf("%d\n", *i++); (2)
C언어를 다시 공부중인데..책에 이런 예제가 나왔네요.
전 (1)이나 (2) 모두 같은 거 같은데 (2)는 컴파일 자체가 안되군요.
(실은 (1)도 안되는줄 알았는데 (1)은 가능하군요.)
(1)은 가능한데 (2)는 왜 안될까요?
C언어 책만 수차례 봤는데도 항상 수박 겉핥기식이다 보니 볼때마다 새롭네요. :oops:
Forums:
Re: *i++ 이 안 되는건..
i 가 변수가 아니기 때문에 ++ 연산을 할 수 없기 때문입니다.
저 경우에 i 는 named-pointer 라고 분류될텐데....
포인터처럼 쓸 수는 있지만 저 값 자체를 변경할 수 없습니다.
*(i+j) 는 일반 연산이며, 결과로 인해 i 값이 변경되지 않지만,
*i++ 은 ++ 연산의 결과가 i 값을 변경시키기 때문에 허용되지 않죠.
배열의 이름은 &array_name, sizeof(array_na
배열의 이름은 &array_name, sizeof(array_name), char *s = "string literal"; 의 세 경우를 제외하고는 항상 그 자신의 첫번째 원소를 가리키는 포인터 주소 값으로 변환됩니다.
또한 a[i]라는 배열 참조식의 정의는 *(a + i) 입니다. 이 정의에 의해서 a[i] 를 *(a + i)로도, i[a]로 바꾸어 쓸 수도 있습니다. 좀 더 응용하면 4["ABCDEFG"] (그 결과는 'E') 같은 것 또한 가능합니다.
또한 배열 이름은 lvalue이되 변경될 수 없는 lvalue 입니다. 따라서 대입 연산자의 좌변에 올 수 없습니다. (대입 연산자의 좌변에 올 수 있는 것은 변경가능한 lvalue 뿐입니다) 또한 마찬가지 이유로 ++, -- 연산자의 피연산자로도 사용될 수 없습니다.
C++로 얘기하면 (C99 스펙을 보지 않아서 모르겠지만)[cod
C++로 얘기하면 (C99 스펙을 보지 않아서 모르겠지만)
등가입니다.
i의 값은 Update 불가능하게 돼 있습니다.
[quote="lsj0713"]배열의 이름은 &array_name
배열형 수식이 대입 연산자의 좌측 피연산자로 사용될 수 없는 이유는 modifiable lvalue 이기 때문이 아니라, lvalue 이던 배열이 몇몇 문맥을 제외하고는 포인터로 변환되며 더이상 lvalue 가 아니기 때문입니다.
아래의 길고 긴 링크를 확인해 주시기 바랍니다.
http://groups.google.com/groups?q=author:mycoboco%40hanmail.net+%ED%8F%AC%EC%9D%B8%ED%84%B0+modifiable+lvalue&hl=ko&lr=&ie=UTF-8&scoring=d&selm=9jmp52%24lqn%241%40news.netple.com&rnum=2
大逆戰
관심 가져주셔서 감사합니다. :D
관심 가져주셔서 감사합니다. :D
...제가 그동안 꽤 오랫동안 유언비어를 퍼트려 온 셈인데 참으로 걱정이
...제가 그동안 꽤 오랫동안 유언비어를 퍼트려 온 셈인데 참으로 걱정이군요. -_-; 포스팅된지 꽤 오래된 글인데 아직 읽어보지 못했었다니...그래도 활동한곳이 kldp 외엔 별로 없으니 그나마 다행입니다. -_-; 외운거 그대로 읊는 제 문제점이 드러나는 순간인데... 그동안 피해 입으신 분들께 사과드립니다.
그래도 유언비어는 계속됩니다. 기대해주세요(...)
댓글 달기