C++에서 *&와 **&의 기능 및 차이점

Haider Ali 2024년2월16일
  1. C++에서 *&**&의 기능 및 차이점
  2. C++에서 포인터로 값 처리
  3. C++에서 참조 포인터로 값 처리
  4. C++에서 포인터 대 포인터 참조(이중 포인터)로 값 처리
C++에서 *&와 **&의 기능 및 차이점

이 가이드는 C++에서 *&**&의 차이점과 기능을 설명합니다. 이러한 기호를 이해하려면 C++의 포인터 개념을 잘 알고 있어야 합니다.

따라서 전체 가이드를 읽기 전에 포인터에 대한 가이드를 방문하세요. 이 개념을 이해하면 이 가이드를 쉽게 이해할 수 있습니다.

C++에서 *&**&의 기능 및 차이점

포인터로 값을 처리할 때 포인터를 사용합니다. 구문은 *ptr입니다.

다음 예제를 통해 이 전체 개념을 이해해 봅시다.

#include <iostream>
using namespace std;

// global variables
int value_1 = 10, value_2 = 20, *global_ptr;

단순히 value_1, value_2라는 두 개의 변수와 *global_ptr로 하나의 전역 포인터를 생성합니다. 다음으로 모든 것을 명확히 하기 위해 세 가지 다른 기능과 방법을 만들었습니다.

그 기능은 다음과 같습니다.

C++에서 포인터로 값 처리

// function which handles values by pointer
void byPointer(int *ptr) {
  *ptr = 5;
  ptr = global_ptr;
  *ptr = 3;
}

첫 번째 함수는 매개변수가 포인터임을 알 수 있듯이 포인터로 값을 처리합니다.

내부에서는 단순히 포인터의 값을 재정의하고 전역 포인터를 가리키고 나중에 해당 값을 다시 재정의합니다. main() 함수를 살펴보겠습니다.

int main() {
  // a pointer to value 1
  int *ptrValue_1 = &value_1;

  // a global pointer having an address of value 2

  global_ptr = &value_2;

  // values before calling function
  cout << "Value_1 = " << value_1 << endl;
  cout << "Value_2 = " << value_2 << endl;

  cout << "ptrValue_1 = " << ptrValue_1 << endl;
  cout << "global_ptr = " << global_ptr << endl;

  byPointer(ptrValue_1);

  // values after calling function
  cout << "Value_1 = " << value_1 << endl;
  cout << "Value_2 = " << value_2 << endl;

  cout << "ptrValue_1 = " << ptrValue_1 << endl;
  cout << "global_ptr = " << global_ptr << endl;
  return 0;
}

먼저 첫 번째 변수의 주소를 가리키는 포인터를 만들었습니다. 전역 포인터는 두 번째 변수의 주소를 가리키고 있습니다.

변수 value_1value_2의 초기 값이 각각 10 및 20인 것을 볼 수 있으므로 포인터 ptrValue_1을 위에서 언급한 함수에 전달합니다.

그러나 byPointer() 함수 내에서 해당 값이 재정의됩니다. 포인터는 또한 value_2의 주소를 가리키는 전역 포인터의 주소를 가리키고 있습니다. 이것이 두 값이 모두 변경된 이유입니다.

위 코드의 출력은 다음과 같습니다.

Value_1 = 10
Value_2 = 20
ptrValue_1 = 0x4b8000
global_ptr = 0x4b8004
Value_1 = 5
Value_2 = 3
ptrValue_1 = 0x4b8000
global_ptr = 0x4b8004

보시다시피 두 변수의 값이 변경되었지만 포인터의 주소는 변경되지 않았습니다. 이는 포인터의 복사본을 만들고 이러한 방식으로 값을 처리하는 복사본을 사용하여 값을 처리하기 때문입니다.

주소가 변경되지 않은 이유입니다. 이 개념은 더 이해하는 데 도움이 될 것입니다.

C++에서 참조 포인터로 값 처리

이제 C++에서 *&의 개념을 이해해 봅시다. 다음 코드를 살펴보십시오.

// function which handle values by pointer Reference
void byPointerReference(int*& ptr) {
  *ptr = 40;
  ptr = global_ptr;
  *ptr = 50;
}

위의 메서드에서는 포인터에 대한 참조를 매개 변수로 전달합니다. 포인터를 전달한 함수와 동일하게 작동합니다.

유일한 차이점은 포인터의 주소도 변경된다는 것입니다. 메서드 이후 포인터의 주소는 이 코드에 따라 전역 포인터의 주소와 동일합니다.

int main() {
  // a pointer to value 1
  int *ptrValue_1 = &value_1;

  // a global pointer having the address of value 2

  global_ptr = &value_2;

  // values before calling function
  cout << "Value_1 = " << value_1 << endl;
  cout << "Value_2 = " << value_2 << endl;

  cout << "ptrValue_1 = " << ptrValue_1 << endl;
  cout << "global_ptr = " << global_ptr << endl;

  byPointerReference(ptrValue_1);

  // values after calling function
  cout << "Value_1 = " << value_1 << endl;
  cout << "Value_2 = " << value_2 << endl;

  cout << "ptrValue_1 = " << ptrValue_1 << endl;
  cout << "global_ptr = " << global_ptr << endl;
  return 0;
}

여기서 아이디어는 주소와 포인터의 값이 모두 변경된다는 것을 보여주는 것입니다. 위 코드의 출력은 다음과 같습니다.

Value_1 = 10
Value_2 = 20
ptrValue_1 = 0x4b8000
global_ptr = 0x4b8004
Value_1 = 40
Value_2 = 50
ptrValue_1 = 0x4b8004
global_ptr = 0x4b8004

C++에서 포인터 대 포인터 참조(이중 포인터)로 값 처리

단일 포인터 참조와 동일하게 작동합니다. 유일한 차이점은 이중 포인터라는 것입니다.

예를 들어, 한 상자에 선물을 포장하고 같은 선물을 상자에 포장하면 결국 상대방이 선물을 갖게 됩니다. 그것은 차이를 만들지 않습니다.

유일한 차이점은 구문에 있습니다. 이중 포인터 참조는 다음과 같습니다.

int **ptrToptr = &ptrValue_1;

함수/메소드를 살펴보겠습니다.

void bypointerPointerReference(int**& ptr) {
  **ptr = 40;
  *ptr = global_ptr;
  **ptr = 50;
}

구문을 제외하고는 차이가 없습니다. 주요 기능은 다음과 같습니다.

int main() {
  // a double pointer to value 1
  int *ptrValue_1 = &value_1;
  int **ptrToptr = &ptrValue_1;

  // a global pointer having an address of value 2

  global_ptr = &value_2;

  // values before calling function
  cout << "Value_1 = " << value_1 << endl;
  cout << "Value_2 = " << value_2 << endl;

  cout << "ptrValue_1 = " << ptrValue_1 << endl;
  cout << "global_ptr = " << global_ptr << endl;
  bypointerPointerReference(ptrToptr);

  // values after calling function
  cout << "Value_1 = " << value_1 << endl;
  cout << "Value_2 = " << value_2 << endl;

  cout << "ptrValue_1 = " << ptrValue_1 << endl;
  cout << "global_ptr = " << global_ptr << endl;
  return 0;
}

출력은 위와 동일할 것입니다.

Value_1 = 10
Value_2 = 20
ptrValue_1 = 0x4b8000
global_ptr = 0x4b8004
Value_1 = 40
Value_2 = 50
ptrValue_1 = 0x4b8004
global_ptr = 0x4b8004
작가: Haider Ali
Haider Ali avatar Haider Ali avatar

Haider specializes in technical writing. He has a solid background in computer science that allows him to create engaging, original, and compelling technical tutorials. In his free time, he enjoys adding new skills to his repertoire and watching Netflix.

LinkedIn

관련 문장 - C++ Pointer