참조로 배열 전달


184

정적 할당 배열을 참조로 전달하는 방법은 무엇입니까?

void foo(int (&myArray)[100])
{
}

int main()
{
    int a[100];
    foo(a);
}

않습니다 (&myArray)[100]참조 어떤 배열을 전달하는 어떤 의미 또는 단지 구문이? 별도의 괄호와 큰 괄호가 여기에 이해되지 않습니다. 감사.


함수 매개 변수와의 Rvalue 대 Lvalue 관계가 있습니까?
John DB


답변:


228

배열 참조의 구문입니다 (&array). (잘못된) 참조 배열이 아닌 배열에 대한 참조를 컴파일러에 명확히하기 위해 사용해야 합니다 int & array[100];.

편집 : 약간의 설명.

void foo(int * x);
void foo(int x[100]);
void foo(int x[]);

이 세 가지는 동일한 기능을 선언하는 다른 방법입니다. 그것들은 모두 int *매개 변수 를 취하는 것으로 취급되며 크기 배열을 전달할 수 있습니다.

void foo(int (&x)[100]);

100 개의 정수 배열 만 허용합니다. 안전하게 사용할 수 있습니다 sizeofx

void foo(int & x[100]); // error

이것은 "참조의 배열"로 해석되는데, 이는 합법적이지 않습니다.


왜 참조 배열을 가질 수 int a, b, c; int arr[3] = {a, b, c};없습니까?
Vorac

4
아하, 왜 그런지 알았습니다 .
Vorac

2
누군가 void foo(int & x[100]);"참조 배열"로 해석되는 이유를 설명해 주 시겠습니까? "오른쪽에서 왼쪽으로"규칙이기 때문입니까? 그렇다면 void foo(int (&x)[100]);"어레이에 대한 참조"로 구문 분석되는 방식과 일치하지 않는 것 같습니다 . 미리 감사드립니다.
zl9394

3
왼쪽에서 오른쪽이 아니고 안쪽에 있으며 []가 &보다 꽉 묶입니다.
philipxy

48

필요한 구문 일뿐입니다.

void Func(int (&myArray)[100])

^ int매개 변수 이름은 참조 로 100의 배열을 전달합니다 myArray.

void Func(int* myArray)

^ 배열을 전달하십시오. 배열이 포인터로 감소합니다. 따라서 크기 정보가 손실됩니다.

void Func(int (*myFunc)(double))

^ 함수 포인터를 전달하십시오. 이 함수는 inta를 반환하고 a를 사용 double합니다. 매개 변수 이름은 myFunc입니다.


가변 크기 배열을 참조로 어떻게 전달합니까?
Shivam Arora

@ShivamArora 함수를 템플릿 화하고 크기를 템플릿 매개 변수로 만듭니다.
Martin York

24

구문입니다. 함수 인수에서 int (&myArray)[100]를 묶는 괄호 &myArray가 필요합니다. 당신이 그들을 사용하지 않는 경우, 당신은 통과 될 것입니다 array of references및이 때문이다 subscript operator []오버 더 높은 우선 순위를 갖습니다 & operator.

예 : int &myArray[100] // array of references

따라서이를 사용 type construction ()하면 컴파일러에게 100 개의 정수 배열에 대한 참조를 원한다고 알 수 있습니다.

예 : int (&myArray)[100] // reference of an array of 100 ints


"사용하지 않으면 array of references"- 전달할 수 있습니다. 물론 존재하지 않으므로 컴파일 오류가 발생합니다. 연산자 우선 순위 규칙은 이것이 기본적으로 어쨌든 발생해야한다고 주장하는 것이 재미 있습니다.
underscore_d

타입 구성 ()에 대한 튜토리얼이 더 있습니까?
최고 시프터

고맙게도 연산자 우선 순위에 대한 이유가 포함 된 설명이 필요했기 때문에 왜 이런 식으로 수행 해야하는지 이해할 수 있습니다.
cram2208

4

배열은 기본적으로 포인터에 의해 전달됩니다. 더 나은 이해를 위해 함수 호출 내에서 배열을 수정할 수 있습니다.


2
값으로 배열을 전달할 수 없습니다. 함수가 포인터를 받으면 배열은 첫 번째 요소에 대한 포인터로 붕괴합니다. 당신이 여기서 무엇을 말하려고하는지 잘 모르겠습니다.
Ulrich Eckhardt

내가 전에 말했듯이 "배열은 값에 의해 전달 될 수 없다"고 말을하려고 해요 @UlrichEckhardt, 그들은 참조로 전달 기본입니다
에두아르도 A. 페르난데스 디아즈

8
배열은 값이나 참조로 전달되지 않습니다. 포인터로 전달됩니다. 배열이 기본적으로 참조로 전달되면 sizeof를 사용하는 데 아무런 문제가 없습니다. 그러나 그렇지 않습니다. 함수에 전달되면 배열이 포인터로 붕괴됩니다.
user3437460

2
배열은 포인터로 분해되거나 참조로 전달 될 수 있습니다. 예를 들어, char arr[1]; foo(char arr[]).arr을 사용하면 포인터가 저하됩니다. 를 사용하는 동안 char arr[1]; foo(char (&arr)[1])arr이 참조로 전달됩니다. 이전 형식은 종종 차원이 없어지기 때문에 잘못된 형식으로 간주됩니다.
zl9394

다시, "배열은 ... 포인터에 의해 전달됩니다." 이 설명은 기껏해야 비논리적으로 들리며 초보자에게는 혼란 스러울 수 있습니다. 배열 변수 의 이름 은 값이 배열의 첫 번째 구성원에 대한 포인터 인 유효한 표현식입니다. 함수 foo(T* t)가 있고 배열 T a[N];이 있으면 쓸 때 foo(a);포인터를 전달하는 것이 아니라 배열을 전달하는 것이 아니라 포인터를 값으로 전달하는 것이 더 정확하다고 생각합니다.
솔로몬 천천히

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.