Language/C++

[C++] 포인터

Return 2022. 6. 5. 11:22

Introduce

지금까지 했던 방식 

int x = 1;

- x라는 이름의 4byte 정수 타입의 바구니를 만들고, x라는 변수를 스택 메로리에 할당했다.

즉, x바구니에 1이라는 숫자를 넣으라는 의미 

- 스택 메모리에 있는 특정 주소(x바구니)에 우리가 원하는 값을 넣는 셈.

- x를 비유하자면 메모리에 이름을 붙인 것이다. 

- call by value에 의한 계속되는 복사의 문제  [원본을 직접 안건드리고 복사를 해서 건드린다.]

[한계점] : 원본 수정이 필요할때 ... >> 포인터의 사용 

 

포인터의 개념 

- 바구니는 바구니인데 [주소]를 저장하는 바구니이다. 

- 변수를 선언할때 *가 등장했다. >> 주소 

int *ip = &x;

근데.. 남의 주소를 갖고 뭘 할까 ? 

- [주소를 저장하는 바구니]가 가리키는 주소로 가서 무엇인가 해라. 

- *변수이름 = 값 ; 

- *는 사용시점에 따라서 구분해서 기억해야한다. 

- 1. 변수를 선언할때 : 주소를 저장하는 바구니를 만든다. 

- 2. 사용할때 [포탈타고 해당 주소로 순간이동] 

int y = *ip;
*ip = 0;

포인터 연산 

주소연산자 

& : 해당 변수의 주소를 알려주세요

int number = 1;
int *pointer = &number;

산술연산자 

number += 1;
pointer += 1;

- number에 1을 더하면 2가 된다. 

- pointer에 1을 더하면 pointer가 가리키고 있는 변수의 크기만큼 증가한다. (int의 경우 4byte이므로 4증가)

간접연산자

* : 포탈 타고 순간 이동 

*pointer = 2

간접멤버연산자 

struct Player
    {
        int hp;     // +0 위치에 hp 저장.
        int damage; // +4 위치에 damage 저장
    };

    Player player;
    player.damage = 100;
    player.hp = 100;

    Player *playerptr = &player;
    (*playerptr).hp = 200;
    (*playerptr).damage = 200;

    playerptr->hp = 300; // 위 표현과 완벽히 동일.
    playerptr->damage = 300;

    return 0;
  }