C ++ 참조로 배열 전달
참조로 배열을 전달할 수 있습니까?
 void foo(double& *bar) 
 
내 컴파일러가 아니오라고 말하는 것 같습니다. 왜? 참조로 배열을 전달하는 올바른 방법은 무엇입니까? 아니면 해결 방법? 내 메서드가 수정해야하고 나중에 검색해야하는 배열 인수가 있습니다. 또는이 배열을 잘 작동하는 클래스 멤버로 만들 수 있지만 코드의 다른 부분에는 많은 단점이 있습니다 (피하고 싶습니다).
감사합니다.
배열은 실제로 참조로만 전달할 수 있습니다.
void foo(double (&bar)[10])
{
}
 
이렇게하면 다음과 같은 작업을 할 수 없습니다.
double arr[20];
foo(arr); // won't compile
 
임의의 크기 배열을에 전달할 수 있으려면이를 foo템플릿으로 만들고 컴파일 타임에 배열의 크기를 캡처합니다.
template<typename T, size_t N>
void foo(T (&bar)[N])
{
    // use N here
}
 
를 사용 std::vector하거나 C ++ 11을 지원하는 컴파일러가있는 경우 std::array.
예,하지만 참조에 대한 인수 일치의 경우 포인터에 대한 암시 적 배열이 자동이 아니므로 다음과 같은 것이 필요합니다.
void foo( double (&array)[42] );
 
또는
void foo( double (&array)[] );
 
그러나 일치 할 때 double [42]및 double []구별되는 유형입니다. 알 수없는 차원의 배열이있는 경우 두 번째와 일치하지만 첫 번째는 일치하지 않으며 42 개 요소가있는 배열이있는 경우 첫 번째와 일치 하지만 두 번째는 일치 하지 않습니다 . (후자는 IMHO, 매우 반 직관적입니다.)
두 번째 경우에도 차원을 전달해야합니다. 함수 내부에 있으면 복구 할 방법이 없기 때문입니다.
요소 만 수정하려는 경우 :
void foo(double *bar);
 
충분합니다.
주소를 (예 :)로 수정하고 realloc싶지만 배열에서 작동하지 않는 경우 :
void foo(double *&bar);
 
올바른 형식입니다.
C ++를 사용할 때 여전히 여기에서 누락 된 필수 제안은 std::vector<double>.
참조로 쉽게 전달할 수 있습니다.
void foo(std::vector<double>& bar) {}
 
C ++ 11을 지원하는 경우 std::array.
참고로 :
8.3.5.8 매개 변수의 유형이 "T의 알려지지 않은 경계의 배열에 대한 포인터"또는 "T의 알려지지 않은 경계의 배열에 대한 참조"형식의 유형을 포함하는 경우 프로그램의 형식이 잘못되었습니다.
다른 대답은 말합니다 마찬가지로 넣어 &애프터 *.
이것은 때때로 혼란 스러울 수있는 흥미로운 점을 가져옵니다. 유형은 오른쪽에서 왼쪽으로 읽어야합니다. 예를 들어, 이것은 (맨 오른쪽부터 시작 *하여) int에 대한 상수 포인터에 대한 포인터입니다.
int * const *x;
 
따라서 당신이 쓴 것은 참조에 대한 포인터가 될 것입니다.
참고 URL : https://stackoverflow.com/questions/10007986/c-pass-an-array-by-reference
'developer tip' 카테고리의 다른 글
| JavaScript에서 &와 &&의 차이점은 무엇입니까? (0) | 2020.11.27 | 
|---|---|
| 정적 코드 블록 (0) | 2020.11.27 | 
| 모카의 글로벌`before`와`beforeEach`? (0) | 2020.11.27 | 
| 정규 표현식으로 겹치는 일치를 찾는 방법은 무엇입니까? (0) | 2020.11.27 | 
| 요소를 기울이면서 텍스트를 정상적으로 유지하는 방법 (비뚤어지지 않음) (0) | 2020.11.27 |