C++에서 참조와 포인터로 인수 전달

Jinku Hu 2023년10월12일
  1. &variable표기법을 사용하여 C++에서 참조로 함수 인수 전달
  2. *variable표기법을 사용하여 C++에서 참조로 함수 인수 전달
  3. (&array_variable)[x][y]표기법을 사용하여 C++에서 참조로 2D 배열 전달
C++에서 참조와 포인터로 인수 전달

이 기사에서는 참조로 인수를 전달하는 방법과 C++에서 포인터로 전달하는 방법에 대해 설명합니다.

&variable표기법을 사용하여 C++에서 참조로 함수 인수 전달

인수 전달은 서로 다른 코드 블록 간의 데이터 교환을위한 유연한 인터페이스를 제공하는 함수의 가장 일반적인 기능입니다. 함수가 호출 될 때마다 전달 된 인수에 의해 매개 변수가 생성되고 초기화됩니다. 일반적으로 인수 전달을 위해 두 가지 방법이 구별됩니다. 값으로 전달되고 참조로 전달되며, 후자는 매개 변수가 해당 인수의 별칭이되도록합니다. 다음 예에서는 인수가 참조로 전달되고int &var표기법이 사용되는 기본 정수 스왑 함수를 보여줍니다. swapIntegers함수가 반환되면main함수 범위의int개체가 수정됩니다.

#include <iostream>

using std::cout;
using std::endl;

void swapIntegers(int& x, int& y) {
  int z = x;
  x = y;
  y = z;
}

int main() {
  int a = 45, b = 35;
  cout << "a = " << a << " b = " << b << "\n";

  cout << "Swapping a and b ...\n";
  swapIntegers(a, b);

  cout << "a = " << a << " b = " << b << "\n";

  return EXIT_SUCCESS;
}

출력:

a = 45 b = 35
Swapping a and b ...
a = 35 b = 45

*variable표기법을 사용하여 C++에서 참조로 함수 인수 전달

포인터를 사용하여 이전 예제와 유사한 동작을 구현할 수 있습니다. 포인터는 개체의 주소이며*연산자로 역 참조하여 개체 값에 액세스 할 수 있습니다. 포인터를 사용하여 인수를 전달한다는 것은 함수 범위에서 주어진 객체에 액세스하고 값을 수정하여 반환 후에도 상태가 유지되도록 할 수 있음을 의미합니다. 함수에 대한 포인터를 전달하려면 주소 (&) 연산자를 사용하여 액세스해야합니다.

#include <iomanip>
#include <iostream>

using std::cout;
using std::endl;
using std::setw;

void swapIntegers2(int* x, int* y) {
  int z = *x;
  *x = *y;
  *y = z;
}

int main() {
  int a = 45, b = 35;
  cout << "a = " << a << " b = " << b << "\n";

  cout << "Swapping a and b ...\n";
  swapIntegers2(&a, &b);

  cout << "a = " << a << " b = " << b << "\n";

  return EXIT_SUCCESS;
}

출력:

a = 45 b = 35
Swapping a and b ...
a = 35 b = 45

(&array_variable)[x][y]표기법을 사용하여 C++에서 참조로 2D 배열 전달

때로는 2 차원 C 스타일 배열 참조를 함수에 전달하는 것이 편리 할 수 ​​있지만 표기법은 약간 직관적이지 않으며 잘못된 결과를 초래할 수 있습니다. 임의의SIZE차원을 가진 정수 배열이있는 경우 함수 매개 변수에서int (&arr)[SIZE][SIZE]표기법을 사용하여 참조 할 수 있습니다. 괄호()가 누락되면int개체에 대한 참조 배열로 해석되어 컴파일 오류가 발생합니다.

#include <iomanip>
#include <iostream>

using std::cout;
using std::endl;
using std::setw;

void MultiplyArrayByTwoV2(int (&arr)[SIZE][SIZE]) {
  for (auto& i : arr) {
    for (int& j : i) j *= 2;
  }
}

void printArray(int (&arr)[SIZE][SIZE]) {
  for (auto& i : arr) {
    cout << " [ ";
    for (int j : i) {
      cout << setw(2) << j << ", ";
    }
    cout << "]" << endl;
  }
}

constexpr int SIZE = 4;

int main() {
  int array_2d[SIZE][SIZE] = {
      {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};

  MultiplyArrayByTwoV2(array_2d);
  printArray(array_2d);

  return EXIT_SUCCESS;
}

출력:

[  2,  4,  6,  8, ]
[ 10, 12, 14, 16, ]
[ 18, 20, 22, 24, ]
[ 26, 28, 30, 32, ]
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ Function