HOWTO · C++
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_1 및 value_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