programing tip

C ++에서 함수에 배열 전달

itbloger 2020. 12. 13. 09:01
반응형

C ++에서 함수에 배열 전달


#include <iostream>
using namespace std;

void printarray (int arg[], int length) {
    for (int n = 0; n < length; n++) {
        cout << arg[n] << " ";
        cout << "\n";
    }
}

int main ()
{
     int firstarray[] = {5, 10, 15};
     int secondarray[] = {2, 4, 6, 8, 10};
     printarray(firstarray, 3);
     printarray(secondarray, 5);

     return 0;
}

이 코드는 작동하지만 배열이 어떻게 전달되는지 이해하고 싶습니다.

printarray주 함수에서 함수를 호출 하면 배열 이름이 전달됩니다. 배열의 이름은 배열의 첫 번째 요소 주소를 나타냅니다. 이것은 어떻게 동일 int arg[]합니까?


구문

int[]

int[X] // Where X is a compile-time positive integer

정확히 동일합니다

int*

함수 매개 변수 목록에있을 때 (선택적 이름은 생략했습니다).

또한, 이렇게 두 함수에 전달 (참고로 전달되지 않은) 제 요소에 대한 포인터 배열 이름 붕괴 int firstarray[3]int secondarray[5]에 붕괴 int*S.

또한 배열 역 참조와 첨자 구문 (아래 첨자 구문은 x[y])을 사용하는 포인터 역 참조 는 동일한 인덱스를 사용할 때 동일한 요소에 대한 lvalue를 생성합니다.

이 세 가지 규칙이 결합되어 코드를 합법적으로 만들고 예상대로 작동합니다. 배열이 포인터로 붕괴 된 후에 알 수없는 배열의 길이와 함께 함수에 대한 포인터를 전달합니다.


다음과 같이 배열의 위치에 액세스 할 때 이것을 추가하고 싶습니다.

arg[n]

와 같다

*(arg + n) than은 de arg 주소에서 시작하는 n의 오프셋을 의미합니다.

그래서 arg[]될 것입니다*arg


firstarraysecondarray전달되면 int에 대한 포인터로 변환됩니다 printarray().

printarray(int arg[], ...) 다음과 같다 printarray(int *arg, ...)

그러나 이것은 C ++에만 국한되지 않습니다. C는 배열 이름을 함수에 전달하는 것과 동일한 규칙을 가지고 있습니다.


질문에 대한 답변은 이미 받았지만 C ++ 표준에 대한보다 정확한 용어와 참조로 답변을 추가 할 것이라고 생각했습니다.

여기서 두 가지 일이 진행됩니다. 배열 매개 변수는 포인터 매개 변수로 조정 되고 배열 인수는 포인터 인수로 변환됩니다 . 이것들은 완전히 다른 두 가지 메커니즘입니다. 첫 번째는 매개 변수의 실제 유형에 대한 조정이고 다른 하나는 첫 번째 요소에 대한 임시 포인터를 도입하는 표준 변환입니다.

함수 선언에 대한 조정 :

dcl.fct # 5 :

각 매개 변수의 유형을 결정한 후 "T의 배열"(...) 유형의 매개 변수는 "T에 대한 포인터"로 조정됩니다.

그래서 int arg[]로 조정됩니다 int* arg.

함수 인수의 변환 :

conv.array # 1

"NT의 배열"또는 "T의 알 수없는 경계의 배열"유형의 lvalue 또는 rvalue는 "T에 대한 포인터"유형의 prvalue로 변환 될 수 있습니다. 임시 구체화 변환이 적용됩니다. 결과는 배열의 첫 번째 요소에 대한 포인터입니다.

따라서에서 "array of 3 int"유형 printarray(firstarray, 3);의 lvalue firstarray는 첫 번째 요소를 가리키는 "pointer to int"유형의 prvalue (임시)로 변환됩니다.

참고 URL : https://stackoverflow.com/questions/14309136/passing-arrays-to-function-in-c

반응형