이 포스트에서는 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++ 프로그래밍에서 중요한 부분입니다.