이 포스트에서는 C++에서 포인터를 사용하여 주소를 전달하는 방법에 대해 알아보겠습니다. 포인터를 통해 함수 내에서 원본 데이터를 수정하는 다양한 예제를 통해 개념을 이해해보세요.
int main() {
{
int x = 10;
int* px = &x;
cout << x << endl; // 10
cout << *px << endl; // 10
x = 20;
cout << x << endl; // 20
cout << *px << endl; // 20
*px = 30;
cout << x << endl; // 30
cout << *px << endl; // 30
}
}
설명:
x
의 값을 10으로 설정하고, 포인터 px
를 x
의 주소로 초기화합니다.x
와 *px
를 출력하여 값이 같음을 확인합니다.x
의 값을 20으로 변경하고, *px
도 같은 값을 출력합니다.*px
를 30으로 변경하면 x
도 30으로 변경됩니다.이 예제는 포인터를 사용하여 변수의 주소를 가리키고 해당 주소의 값을 변경하는 방법을 보여줍니다.
void swap0(int *px, int *py)
{
int temp = *px;
*px = *py;
*py = temp;
}
int main() {
{
int x = 10, y = 20;
cout << x << endl; // 10
cout << y << endl; // 20
swap0(&x, &y);
cout << x << endl; // 20
cout << y << endl; // 10
}
}
설명:
swap0
함수는 두 정수 포인터를 받아 값을 교환합니다.x
와 y
의 주소를 swap0
에 전달하여 값을 교환합니다.x
와 y
의 값이 바뀌었음을 확인할 수 있습니다.이 예제는 포인터를 사용하여 함수 내에서 원본 변수의 값을 변경하는 방법을 보여줍니다.
int main() {
{
int x = 10, y = 20;
cout << x << endl; // 10
cout << y << endl; // 20
int* px = &x;
int* py = &y;
int temp = *px;
*px = *py;
*py = temp;
cout << x << endl; // 20
cout << y << endl; // 10
}
}
설명:
swap0
함수의 단계를 main 함수 내에서 수동으로 수행합니다.px
와 py
는 x
와 y
의 주소를 가리킵니다.*px
와 *py
를 교환하여 x
와 y
의 값을 바꿉니다.이 예제는 포인터를 사용하여 수동으로 값을 교환하는 방법을 보여줍니다.
void scan(int* n)
{
*n = 10;
}
int main() {
{
int n = 0;
scan(&n);
cout << n << endl; // 10
}
}
설명:
scan
함수는 정수 포인터를 받아 값을 10으로 설정합니다.n
의 주소를 scan
에 전달하여 n
의 값을 10으로 변경합니다.이 예제는 함수 내에서 포인터를 사용하여 변수의 값을 설정하는 방법을 보여줍니다.
struct Weapon {
int price;
int power;
};
void upgrade(Weapon* pWeapon)
{
pWeapon->price += 10;
pWeapon->power += 10;
}
int main() {
{
Weapon weapon{10, 20};
upgrade(&weapon);
cout << weapon.price << endl; // 20
cout << weapon.power << endl; // 30
}
}
설명:
Weapon
구조체를 정의하고 price
와 power
필드를 포함합니다.upgrade
함수는 Weapon
포인터를 받아 값을 수정합니다.weapon
의 주소를 upgrade
에 전달하여 값을 수정합니다.이 예제는 구조체 포인터를 사용하여 함수 내에서 구조체의 값을 수정하는 방법을 보여줍니다.
void print(const Weapon *weapon)
{
cout << weapon->price << endl;
cout << weapon->power << endl;
}
int main() {
{
Weapon weapon{10, 20};
print(&weapon);
}
}
설명:
print
함수는 Weapon
의 const 포인터를 받아 값을 출력합니다.weapon
의 주소를 print
에 전달하여 값을 출력합니다.이 예제는 const 포인터를 사용하여 함수 내에서 구조체의 값을 출력하는 방법을 보여줍니다.
void func0(int nums[4])
{
cout << typeid(nums).name() << endl;
for (int i = 0; i < 4; ++i)
{
int num = nums[i];
cout << num << endl;
}
}
int main() {
{
int nums[4] = {1, 2, 3, 4};
func0(nums);
}
}
설명:
func0
함수는 정수 배열을 받아 값을 출력합니다.nums
의 타입을 출력하면 int*
로 표시됩니다.이 예제는 배열을 함수에 전달할 때 포인터로 전달된다는 것을 보여줍니다.
void func1(int argc, char** argv)
{
// 구현 내용 없음
}
void func2(int argc, char(*argv)[5])
{
// 구현 내용 없음
}
int main(int argc, char* argv[])
{
{
cout << typeid(argv).name() << endl; // char**
}
{
func1(argc, argv);
char strs[][5] = {"abcd", "efgh"};
func2(2, strs);
}
}
설명:
func1
함수는 명령줄 인수를 char**
로 받아 처리합니다.func2
함수는 2차원 배열을 받아 처리합니다.argv
의 타입을 출력하면 char**
로 표시됩니다.이 예제는 명령줄 인수가 실제로 포인터 배열로 전달된다는 것을 보여줍니다.
C++에서 포인터를 사용하여 주소를 전달하면 함수 내에서 원본 데이터를 수정할 수 있습니다. 이를 통해 보다 효율적이고 유연한 코드를 작성할 수 있습니다. 포인터를 사용한 주소 전달의 개념을 이해하는 것은 C++ 프로그래밍에서 중요한 부분입니다.