#include <iostream>
using namespace std;
int main(void)
{
const int nNum = 10;
int *p = NULL;
p= (int *)&nNum;
*p=20;
cout << "nNum = " << nNum << endl;
cout << "*p =" << *p << endl;
cout << "&nNum = "<<&nNum << endl;
cout << " p = "<<p<<endl;
}
nNum 은 상수화 된 변수로 그 안의 값은 10 이다.
포인터 변수 p 는 nNum 의 주소로 초기화 되었다.
하지만 여기서 강제 형변환을 통해 nNum 의 주소로 포인터를 이용하여 접근,
그 값을 바꾸었다. 컴파일 결과는 정상 동작이다. 에러는 발생하지 않았다.
하지만 출력 결과는 보다시피 값은 바뀌지 않았다.
nNum 의 값은 바뀌지 않았고 *p 로 포인터 변수에 저장된 주소값으로 접근한 주소에 저장된 변수 값이 바뀌었다.
주소를 출력해 보면 주소가 동일하다. 같은 주소인데 nNum 은 10, *p 는 20 이다.
이를 통해 알 수 있는 것은 메모리 영역에서 const 를 통해 상수화 된 nNum 은 데이터 영역에 있고
*p 는 스택 영역에 있는다는 점이다. 즉 서로 다른 메모리 영역에 존재한다는 것이다.
동일한 주소이지만 값을 잠시 복사하여 출력하였을 뿐
참조 영역이 다르므로 서로 다른 값이 출력된 것이다.
이를 자세히 알고 싶다면 메모리 관리 방법과 원리를 알아야만 할 것이다.
하지만 자동으로 관리해 주는 부분이므로 굳이 알 필요는 없다.
위의 예제는 좋은 코드의 예가 아니므로 메모리 영역의 이해를 위한 용도 이외에는 사용하지 말자.
강제 형변환을 이용하여 혼란을 줄 수 있는 예이다.
C 스타일의 형변환은 위와 같이 그 위험성이 높다. 형변환에 대한 책임은 프로그래머에게 있다.
따라서 C++ 스타일의 형변환 static_cast<type-name>(변수) 를 이용하는 것이 좋다.
출처 : (장원석님 블로그) http://blog.naver.com/almost_crazy
'프로그래밍 > 참고' 카테고리의 다른 글
알짜배기 정보! (0) | 2013.03.07 |
---|---|
SVN 용어설명 (0) | 2013.03.07 |
printf, scanf (0) | 2013.02.27 |
#include , <stdio.h>, main (0) | 2013.02.27 |
문자열 관리 함수들 총집합! (0) | 2013.02.24 |