포인터 질문자 님이 쓰신 글 :
: 님께서 답변해주신
: : 만약 아래와 같이 하면 원하는 결과가 나오지 않을 것이고 문제가 발생할 수 있음.
: : {
: : int *ip; // 이 상태에서는 ip의 값은 쓰레기 값임.
: : *ip = 10; // 메모리 상의 어떤 번지에 10이 기록될른지?
: : }
: 이 것에 대한 재 질문입니다.
:
: #include
:
: void f(int *n);
:
: main()
: {
: int i =0;
: f(&i);
: cout<<"here is i`s new value:"<
: return 0;
: }
: void f(int *n)
: {
: *n= 100;
: }
: 여기서 *n=100 도 n의 현재 상태는 쓰레기 값인대 메모리 상의 어떤 번지에 100이 기록될런지요?
: 근대 이 소스는 에러없이 100% 잘 작동이 되더라구요..^^;
:
: 그리고
:
: int &f();
: .
: .
: .
: int *x;
: x=f();
: 이 단락이 틀린다라구 나와있는데요.
: 왜 틀린지 자세한 설명도 부탁드리겠습니다.
:
f(&i);를 하게 되면 f 함수 내부의 n변수의 값은 곧 i변수의 번지가 됩니다.
따라서 포인터 변수 n의 값이 쓰레기값이 아닙니다.
: int &f();
이게 정수형 포인터(int*)를 반환하는 함수를 선언하기 위한 것이라면 잘못하신 겁니다.
int *f();로 선언해야 합니다.
1. register를 제외한 모든 변수는 메모리(RAM)의 일정 영역에 자리잡습니다.
register변수의 경우 CPU 내의 레지스터에 생성되므로 번지가 없습니다.
참조형 변수의 경우 기존에 생성된 변수에 다른 이름을 하나 더 붙이는 것입니다.
포인터 변수도 자신만의 메모리를 확보합니다(해당 메모리에 담긴 값을 번지로 해석하는 것만 다르다고 생각하면 됨).
2. 포인터 변수 자신의 메모리에 기록하거나 내용을 읽을 경우 그냥 변수 이름만 사용하면 됩니다.
3. 포인터 변수의 값은 메모리의 번지인데 그 값이 가리키는 번지에 기록하거나 내용을 읽으려면 변수명 앞에 *를 붙입니다.
4. 포인터 변수든 일반 변수든 해당 변수가 위치한 번지를 구하려면 변수명 앞에 &를 붙입니다.
몇 중 포인터 변수이든 원리는 같습니다.
|