Channi Studies

[C++] 포인터 연산/산술 (Pointer Arithmetic) 본문

C++/포인터 (Pointers)

[C++] 포인터 연산/산술 (Pointer Arithmetic)

Chan Lee 2023. 12. 19. 23:40

C++의 포인터는 

  • Assignment Expressions (대입 표현식)
  • Arithmetic Expressions (산술 표현식)
  • Comparison Expressions (비교 표현식)

에서 사용이 가능합니다.

포인터에 대한 다양한 연산(산술)이 가능합니다.

 

다음은 포인터에 적용 가능한 몇가지 연산들입니다.

  • (++)  
    포인터의 값을 증가시켜 배열의 다음 요소를 가르키도록 합니다.
    int_ptr++;

  • (--)  
    포인터의 값을 감소시켜 배열의 이전 요소를 가르키도록 합니다.
    int_ptr--;

  • (+)
    포인터의 값을 n * sizeof(type) 만큼 증가시킵니다.
    int_ptr += n; or int_ptr = int_ptr + n;
  • (-)
    포인터의 값을 n * sizeof(type) 만큼 감소시킵니다.
    int_ptr -= n; or int_ptr = int_ptr - n;

 

 


그렇다면 만약에,

두 포인터 끼리 뺄셈(-)을 하면 어떻게 될까요?

 

그렇게 하면, 두 포인터 사이에 존재하는 요소의 숫자를 알 수 있습니다.

다만, 계산에 사용되는 두 포인터의 타입은 무조건 동일해야합니다.

int n = int_ptr2 - int_ptr1;

 

 


과연 포인터끼리 비교를 하면 어떻게 될까요? (==), (!=)

두 포인터의 값, 즉 해당 포인터들이 각각 가리키는 위치가 동일한지를 알 수 있습니다.

 

중요한점은 그들이 각각 'pointing 하는 위치에 저장된 데이터'는 비교하지 않습니다.

다른 위치에도 똑같은 값이 저장되어 있을 수 있잖아요?

그건 상관이 없다는 뜻입니다.

 

string s1{"hello"};
string s2{"hello"};

string ptr1 {&s1};
string ptr2 {&s2};
string ptr3 {&s3};

cout << (ptr1 == ptr2) << endl;	// false
cout << (ptr1 == ptr3) << endl;	// true

cout << (*ptr1 == *ptr2) << endl; // true
cout << (*ptr1 == *ptr3) << endl; // true

매우 직관적이죠?

 

 

마지막으로 포인터 연산에 관련된 한가지 간단하지만 자주 사용되는 표현을 알려드리겠습니다.

int scores[] {100, 90, 80, 70, -1};
int *score_ptr {scores};

while (*score_ptr != -1){
    cout << *score_ptr << endl;
    score_ptr++;
}

scores 배열과 그에 해당하는 score_ptr를 선언했습니다.

 

그리고 *score_ptr, 즉 score_ptr가 나타내는 주소에 있는 값이 -1이 아닐 때,

score_ptr의 첫번째 값을 출력 하고,

score_ptr++를 해서 (메모리 주소로 치면 +4 겠지요?)

배열의 다음 요소를 출력하는 반복문입니다.

 

이 while문 내부의 줄을 한 줄로 줄일 수 있고, 이는 매우 자주 사용되는 표현입니다.

int scores[] {100, 90, 80, 70, -1};
int *score_ptr {scores};

while (*score_ptr != -1){
    cout << *score_ptr++ << endl;
}

*score_ptr 로 역참조(dereference)를 한 뒤, 증가 연산자로 1을 증가시켰습니다.

간단하지만 동일한 기능을 하고 있죠?

 

이후에 포인터와 배열과 관련된 프로그램에서 유용하게 사용될 수 있는 표현입니다.