。공부 。

<C++> 포인터 '*'와'&'의 의미

kyoe 2008. 1. 5. 12:26
포인터를 사용하기 위해서 우리는 두가지 연산자를 사용한다. '*'와'&'가 그 두개다.
'*'는 포인터 변수를 선언할때도 쓰이지만 또다른 용도로도 사용한다.

- '&'의 쓰임 주소값 반환 -
int temp = 10;
int* pt1 = &temp;
printf("temp 의 주소값 : %d",&temp);
printf("pt1 의 값 : %d",pt1);

'&'는 주소값을 반환하는 용도로 쓰인다.
temp는 변수선언과 동시에 메모리상에 올라가게 되고 그와같이 주소값도 갖게 되는것이다.
예를 들어 temp의 주소값이 0x10이라면  int* pt1 = &temp; 이와같이 코드를 입력하면 temp의 주소값을 포인터pt1에 넣으라는 명령이 된다.
위의 코드에서 3,4번째 라인에 있는 결과값은 0x10되고 두개의 결과값이 동일하다는것을 알수있다.


- '*'의 쓰임 첫번째 포인터변수 선언 -
int* pt1;
char* pt2;
위와같이 사용하면 포인터변수를 선언하는것이다.
간단하게 읽어보면 int형 변수를 가르킬수있는 포인터 pt1 이렇게 읽을수있다.
char형도 읽는건 마찬가지다 하지만 여기서 포인터pt2는 char형만을 가르킬수있다.

- '*'의 쓰임 두번째  포인터가 가르키는 주소의'값' -

int temp = 10;
int* pt1 = &temp;
printf("*pt1 이 가르키는 값 : %d",*pt1);
int형 변수 temp를 상수10으로 초기화 하고 있다. 이 초기화된 값으로 포인터 pt1을 초기화 하고 있는데 포인터변수는 주소값으로 초기화 해야 하기때문에  '&'연산자를 이용해서 temp의 주소값으로 pt1을 초기화 하고있다.
printf()함수에서 포인터pt1이 가르키는 주소의 값을 출력하기 위해서 변수뒤에 '*'연산자를 붙여주고 있다 이렇게 '*'연산자는 포인터에서 두가지 용도로 쓰이는데 변수의타입을 정의하는 그러니까 int 앞에 '*'가 붙으면 포인터변수를 선언하는 것이고  변수의 타입 없이 변수뒤에 붙으면 포인터가 가르키는 값을 갖게 되는것이다.

[ 포인터와 이중포인터 예제 ]

void main(){
  
    int temp;
    int *p1;           //int형을 가르킬수있는 포인터
    int **pp1;      //int형 의 포인터를 가르킬수있는 포인터

    p1 = &temp;        //temp의 주소값으로 포인터p1을 초기화
    pp1 = &p1;        //포인터 p1의 주소값으로 포인터 pp1을 초기화
   *p1 = 10;         //'*'를 뒤에 붙였으므로 p1이 가르키는 temp의 값을 직접적으로 바꿀수있다.
                        //즉 temp = 10; 과 동일

    printf("자신들이 가리키는 값 출력\n");
    printf("temp = %d\n",temp);        //10출력
    printf("*p1 = %d\n",*p1);        //10출력    
    printf("*pp1 = %d\n",*pp1);        //p1의 값 출력(즉 temp의 주소값)
    printf("**pp1 = %d\n",**pp1);    //temp의 값 10출력

//-------------------------------------
    printf("자기자신의 주소값 출력\n");
    printf("&temp = %d\n",&temp);    //temp의 주소값 출력
    printf("&p1 = %d\n",&p1);
    printf("&pp1 = %d\n",&pp1);
//-------------------------------------
    printf("자신들이 가르키는 주소값 출력\n");
    printf("temp = %d\n",temp);    //temp 는 포인터가 아니기 때문에 temp의 값을 출력시켰다.
    printf("&p1 = %d\n",p1);        //temp의 주소값으로 초기화를 시켜줬으므로 temp의 주소값이 출력
    printf("&pp1 = %d\n",pp1);        //p1의 주소값으로 초기화를 시켜줬다. p1의 주소값출력

}
        - 결과 값 -
자신들이 가리키는 값 출력
temp = 10
*p1 = 10
*pp1 = 1245052
**pp1 = 10

자기자신의 주소값 출력
&temp = 1245052
&p1 = 1245048
&pp1 = 1245044

자신들이 가르키는 주소값 출력
temp = 10
&p1 = 1245052
&pp1 = 1245048


위예제를 간단히 설명하자면 아래와 같다.

포인터 pp1은 포인터p1의 주소값을 갖고 있기 때문에 포인터p1을 가르키게 되고
포인터p1은 temp의 주소값을 갖고 있으므로 temp를 가르키게 되겠죠.
[temp] <------- [*p1] <-------[**pp1]

만약 pp1 = &temp; 이렇게 &temp의 주소값을 포인터 pp1에 넣으면 에러가 발생한다.
포인터 pp1은 int형변수를 가르키는 포인터가 아니라 int형의 포인터를 가르킬수 있는 포인터이기 때문에 에러가 발생하게 되는것이다.

음... 말이 좀 어렵게 설명된거 같다...