|
*(ptr+1) = 'e';
정확히 이부분이 에러가 납니다..
당연히 *(ptr + 1) = "e";
는 안되지여..."e"자체가 문자열 변수인기 때문에(주소값)
L-value에는 주소값이 와야 하기때문에 문법적 에러입니다.
그런데.*(ptr+1) = 'e';
이부분은 문법적 에러는 아닌데 실행중에 에러가 나서
질문한겁니다..
나오미님께서는 변경이 가능하다고 했는데..
"test"라는 문자열 선언시 이것이 const라는 형으로 선언이
된다면 당연히 값은 변경이 안되는거 아닌가여..?
나오미 님이 쓰신 글 :
: char *ptr = "test";
:
: 위의 문장에서 "test"를 실제형상수라 합니다.
: 실제형상수는 문자상수,문자열상수,숫자상수 등등으로
: 나눌 수 있을것입니다.
: 또한 가장 빈번하게 사용되는 상수의 형태일것입니다.
:
: 또한 위와 같은 형태는 선언과 동시에 초기화를 한 문장입니다.
: 지역변수를 사용할 경우 에러 발생에 대비하게 위하여
: 습관적으로 선언과 동시에 초기화를 하도록 연습합니다.
:
: 포인터와 배열은 호환이 됩니다.
: 호환이 된다고 해서 같다는 의미는 아닙니다.
: 위 문장은
: char ptr[] = "test"; // ---- (1)
: 와 같은 형태로 선언하여도 됩니다.
: ptr에 들어가야 할 값은 어차피 "test"라는 문자열이 저장될
: 메모리의 선두번지이니까요.(설명하다 보니 또 같다가 되버리네..)
:
: 또한
: char ptr[5] = "test"; // ---- (2)
: 와 같이 선언하여도 같은 의미입니다.
:
: 단 (1)의 경우 배열의 크기는 명시적으로
: 결정하지 않았지만 컴파일러가 컴파일시에 그 크기를
: 결정하여 할당해줍니다.
:
: 만일 (2)와 같은 형태의 초기화를 했다고 가정한다면
: 그 값을 변경할 수 없을까요?
:
: 변경할 수 있습니다. 만일 변경 할 수 없다면
: 프로그래밍에 어려움 만이 남을것입니다.
:
: 그렇다면 (1)과 같은 형태의 초기화 형태에서도
: 가능하다는 결론이 나옵니다.
: 컴파일시 컴파일러가 그 크기를 정해주기때문에....
: 곧 (1)과 같은 형태는 포인터로 변환이 될 수 있으므로
: 이것 역시 변환이 가능하다는 결론을 내릴 수 있게
: 됩니다.
:
: 님께서 질문하신 내용중 몇 구절을 살펴보면
:
: "...*(ptr + 1)의 값을 변경할려고 ",
: "그중에서 e라는 부분을 변경할려고 하면",
: "당연히 배열로 잡을경우에는 아무문제가 없구여"
:
: 등의 문장을 발견할 수 있습니다.
:
: 'e'라는 값을 변경하기 위해 다음과 같은 과정이 있을 수 있습니다.
:
: ptr[1] = 'x';
: *(ptr+1) = 'x';
:
: 하지만 다음과 같은 문장은 에러가 발생합니다.
: *(ptr+1) ="x"
:
: 왜 일까요?
: 감이 오셨으리라 생각합니다.
: 저의 추측으로 에러를 생각해 적어봤는데.. 제대로 추측한건지...
: 사우나 갔다와서 자기 전에 적어봤습니다... 자야징...
:
: 상수중에 바꿀수 없는 상수는 C++의 경우 const가 붙은
: 선언형 상수, 그리고 열거형 상수 입니다.
: 물론 이것 역시 컴파일러가 컴파일시에 그렇게 확인해 줄
: 뿐입니다.
|