char *array[]={"hello","world"}; printf("%s",*++array);
이렇게 하면 왜 에러가 날까요? world를 출력하려고하는건데.
보통 파일 오픈할떄 fp = fopen(*++argv,"r") 이런식으로 쓰는데. 왜. 위에껀 안될까요?
참고로 *(array+1)은 되더라구요.
array는 포인터가 아니라 배열이름이니까요. 배열이름은 값을 변경시킬수 없습니다. 방금 테스트해보니까 gcc는 'error: lvalue required as increment operand'라면서 아예 컴파일조차 안되네요. ++argv는 아마 char *[]가 아니라 char **로 선언되던거 아닌가요?
*argv[] 이것과 **argv는 같은게 아니에요?
전자는 배열이고 후자는 포인터죠.
마찬가지로
void f(int array1[]) { ++array1; }
int array2[] = {1, 2, 3}; ++array2;
이유는...
array1은 함수의 인자로 선언되어서 int *array1 으로 선언된거랑 같지만 array2는 배열이기 때문에 array2 자체의 값은 바꿀수 없습니다.
함수인자일때는 포인터와 동일하다는건 몰랐네요. 그렇다면 main()으로 넘어오는 argv에 대해서는 char **든 char *[]든 동일하겠군요.
네.. 동일해요..
아. 그런거군요 :D
그런데 컴파일하면. 배열도 포인터로 바꾸는걸로 알고있거든요. 이를태면 int integer[5]={1,2,3,4,5}; printf("%d",0[integer]); 와 같은경우도. 어차피 배열도 컴파일되면 어셈블러로는 *(integer+1) 이렇게 바뀌는것처럼요.
위의 정수형같은경우도 지금해보니까. 같은 오류가 나네요. 아.. 포인터로 바뀌어도 unary operation은 안되나봐요.
오. 귀중한거 알았네요. 감사합니다 ㅎ
근데 왜안될까요? 위와같이 0[integer]에서처럼 배열이라도 포인터처럼 인식하면서.
이미 답은 적었습니다. 배열이름은 그 값을 바꿀수 없습니다. ++integer는 integer자체의 값을 바꾸는 것이기 때문에 안되는 거고, integer+1은 integer는 그대로두고, 거기에 +1한 결과를 돌려주는 것이죠. 전혀 다릅니다.
텍스트 포맷에 대한 자세한 정보
<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]
array는 포인터가
array는 포인터가 아니라 배열이름이니까요.
배열이름은 값을 변경시킬수 없습니다.
방금 테스트해보니까 gcc는 'error: lvalue required as increment operand'라면서 아예 컴파일조차 안되네요.
++argv는 아마 char *[]가 아니라 char **로 선언되던거 아닌가요?
*argv[] 이것과 **argv는
*argv[] 이것과 **argv는 같은게 아니에요?
전자는 배열이고
전자는 배열이고 후자는 포인터죠.
마찬가지로 void f(int
마찬가지로
는 되고
는 안됩니다.
이유는...
array1은 함수의 인자로 선언되어서 int *array1 으로 선언된거랑 같지만
array2는 배열이기 때문에 array2 자체의 값은 바꿀수 없습니다.
함수인자일때는
함수인자일때는 포인터와 동일하다는건 몰랐네요.
그렇다면 main()으로 넘어오는 argv에 대해서는 char **든 char *[]든 동일하겠군요.
네.. 동일해요..
네.. 동일해요..
아. 그런거군요
아. 그런거군요 :D
그런데
컴파일하면. 배열도 포인터로 바꾸는걸로 알고있거든요. 이를태면
int integer[5]={1,2,3,4,5};
printf("%d",0[integer]);
와 같은경우도. 어차피 배열도 컴파일되면 어셈블러로는 *(integer+1) 이렇게 바뀌는것처럼요.
위의 정수형같은경우도 지금해보니까. 같은 오류가 나네요.
아.. 포인터로 바뀌어도 unary operation은 안되나봐요.
오. 귀중한거 알았네요. 감사합니다 ㅎ
근데 왜안될까요? 위와같이 0[integer]에서처럼 배열이라도 포인터처럼 인식하면서.
이미 답은
이미 답은 적었습니다. 배열이름은 그 값을 바꿀수 없습니다.
++integer는 integer자체의 값을 바꾸는 것이기 때문에 안되는 거고, integer+1은 integer는 그대로두고, 거기에 +1한 결과를 돌려주는 것이죠.
전혀 다릅니다.
댓글 달기