'C++'에 해당되는 글 2건

  1. 2008.01.05 <C++> 포인터 '*'와'&'의 의미 (6)
  2. 2007.11.25 <C++> 레퍼런스
。공부 。2008.01.05 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형의 포인터를 가르킬수 있는 포인터이기 때문에 에러가 발생하게 되는것이다.

음... 말이 좀 어렵게 설명된거 같다...
신고
Posted by kyoe
TAG C, C++, 포인터
。공부 。2007.11.25 18:03
레퍼런스를 이용해 메모리공간을 좀더 효율적으로 사용할수 있다.
레퍼런스를 간단히 설명하자면 할당된 메모리 공간에 또하나의 다른이름을 붙인다고 생각하면 쉽다 만들어진 레퍼런스 변수는 일반변수와 똑같이 사용된다.
레퍼런스 선언방법과 사용방법을 알아보자

* 레퍼런스 선언 *
int main(void){    
    int val=10;
    int &ref=val;    //변수 val에 또다른 이름을 붙인다.(레퍼런스선언)

    val++;
    cout<<val<<endl;
    cout<<ref<<endl;

    ref++;            //ref를 증가시키면 val의 값도 변한다.val=ref
    cout<<val<<endl;
    cout<<ref<<endl;
    return 0;
}
레퍼런스 변수를 만들기 위해선 만들고자하는 변수앞에 '&'을 붙여주기만 하면된다.
만들어지고 난뒤엔 일반변수와 사용방법이 같다.

* 레퍼런스를 이용한 Call-By-Reference *
void swap(int &x,int &z){    //값을 레퍼런스로 받아 'a'란변수에 'z'란이름을 더붙인다.
    int temp;
    temp = x;
    x = z;
    z = temp;
}

int main(void){
    int a,b;
    a = 10;
    b = 20;

    swap(a,b);    //a,b의 값을 넘긴다.
    cout<<a<<':'<<b<<endl;
    return 0;
}
레퍼런스를 이용해 변수 a와b의 값을 서로 바꾸는 예제이다. 포인터로도 예제를 구현할수있지만 레퍼런스로 구현하는것이 좀더 깔끔해보인다. 하지만 메인함수의 swap(a,b); 이부분말 봐선 이함수가  Call-By-Reference 방식인지 Call-By-Value방식인지 구분할수가 없다. 포인터로 처리를 했다면 swap(&a,&b); 이렇게 변수앞에 '&'을 붙여줘서 어떤방식인지 확인 가능하지만 레퍼런스를 그렇지 못하다. 그렇다고 레퍼런스가 나쁘다는건 아니다.^^;

* 레퍼런스 리턴 *
int& reference(int &a){
    a++;
    return a;
}

int main(void){
    int kyoe1 = 10;
    int &kyoe2 = reference(kyoe1);
    cout << kyoe2<<endl;
    return 0;
}
reference()함수에서 값을 리턴할때 레퍼런스를 리턴하를것을 볼수있다. 레퍼런스를 리턴할때 리턴데이터를 받아주는 곳에선 반드시 레퍼런스로 받아줘야 한다. 만약 메인함수에선 레퍼런스변수 선언을 하는데 reference()함수에서 데이터를 리턴할때 'int&'로 리턴하지않고 일반'int'로 리턴을하면 에러가 발생한다. 'int'형으로 리턴을 하게 되면 int &kyoe2 = 11; 이렇게 선언이되는것과 같기때문이다 레퍼런스를 상수로 초기화할수없기때문에 에러가 발생하게 되는것이다.

신고
Posted by kyoe

티스토리 툴바