정적 할당 배열을 참조로 전달하는 방법은 무엇입니까?
void foo(int (&myArray)[100])
{
}
int main()
{
int a[100];
foo(a);
}
않습니다 (&myArray)[100]
참조 어떤 배열을 전달하는 어떤 의미 또는 단지 구문이? 별도의 괄호와 큰 괄호가 여기에 이해되지 않습니다. 감사.
정적 할당 배열을 참조로 전달하는 방법은 무엇입니까?
void foo(int (&myArray)[100])
{
}
int main()
{
int a[100];
foo(a);
}
않습니다 (&myArray)[100]
참조 어떤 배열을 전달하는 어떤 의미 또는 단지 구문이? 별도의 괄호와 큰 괄호가 여기에 이해되지 않습니다. 감사.
답변:
배열 참조의 구문입니다 (&array)
. (잘못된) 참조 배열이 아닌 배열에 대한 참조를 컴파일러에 명확히하기 위해 사용해야 합니다 int & array[100];
.
편집 : 약간의 설명.
void foo(int * x);
void foo(int x[100]);
void foo(int x[]);
이 세 가지는 동일한 기능을 선언하는 다른 방법입니다. 그것들은 모두 int *
매개 변수 를 취하는 것으로 취급되며 크기 배열을 전달할 수 있습니다.
void foo(int (&x)[100]);
100 개의 정수 배열 만 허용합니다. 안전하게 사용할 수 있습니다 sizeof
에x
void foo(int & x[100]); // error
이것은 "참조의 배열"로 해석되는데, 이는 합법적이지 않습니다.
int a, b, c; int arr[3] = {a, b, c};
없습니까?
void foo(int & x[100]);
"참조 배열"로 해석되는 이유를 설명해 주 시겠습니까? "오른쪽에서 왼쪽으로"규칙이기 때문입니까? 그렇다면 void foo(int (&x)[100]);
"어레이에 대한 참조"로 구문 분석되는 방식과 일치하지 않는 것 같습니다 . 미리 감사드립니다.
필요한 구문 일뿐입니다.
void Func(int (&myArray)[100])
^ int
매개 변수 이름은 참조 로 100의 배열을 전달합니다 myArray
.
void Func(int* myArray)
^ 배열을 전달하십시오. 배열이 포인터로 감소합니다. 따라서 크기 정보가 손실됩니다.
void Func(int (*myFunc)(double))
^ 함수 포인터를 전달하십시오. 이 함수는 int
a를 반환하고 a를 사용 double
합니다. 매개 변수 이름은 myFunc
입니다.
구문입니다. 함수 인수에서 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
"- 전달할 수 있습니다. 물론 존재하지 않으므로 컴파일 오류가 발생합니다. 연산자 우선 순위 규칙은 이것이 기본적으로 어쨌든 발생해야한다고 주장하는 것이 재미 있습니다.
배열은 기본적으로 포인터에 의해 전달됩니다. 더 나은 이해를 위해 함수 호출 내에서 배열을 수정할 수 있습니다.
char arr[1]; foo(char arr[]).
arr을 사용하면 포인터가 저하됩니다. 를 사용하는 동안 char arr[1]; foo(char (&arr)[1])
arr이 참조로 전달됩니다. 이전 형식은 종종 차원이 없어지기 때문에 잘못된 형식으로 간주됩니다.
foo(T* t)
가 있고 배열 T a[N];
이 있으면 쓸 때 foo(a);
포인터를 전달하는 것이 아니라 배열을 전달하는 것이 아니라 포인터를 값으로 전달하는 것이 더 정확하다고 생각합니다.
다음은 참조로 모든 크기와 유형의 배열을 취하는 일반 함수를 작성합니다.
template<typename T, std::size_t S>
void my_func(T (&arr)[S]) {
// do stuff
}