|
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가 붙은
선언형 상수, 그리고 열거형 상수 입니다.
물론 이것 역시 컴파일러가 컴파일시에 그렇게 확인해 줄
뿐입니다.
|