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
firstarray
에 secondarray
전달되면 int에 대한 포인터로 변환됩니다 printarray()
.
printarray(int arg[], ...)
다음과 같다 printarray(int *arg, ...)
그러나 이것은 C ++에만 국한되지 않습니다. C는 배열 이름을 함수에 전달하는 것과 동일한 규칙을 가지고 있습니다.
질문에 대한 답변은 이미 받았지만 C ++ 표준에 대한보다 정확한 용어와 참조로 답변을 추가 할 것이라고 생각했습니다.
여기서 두 가지 일이 진행됩니다. 배열 매개 변수는 포인터 매개 변수로 조정 되고 배열 인수는 포인터 인수로 변환됩니다 . 이것들은 완전히 다른 두 가지 메커니즘입니다. 첫 번째는 매개 변수의 실제 유형에 대한 조정이고 다른 하나는 첫 번째 요소에 대한 임시 포인터를 도입하는 표준 변환입니다.
함수 선언에 대한 조정 :
각 매개 변수의 유형을 결정한 후 "T의 배열"(...) 유형의 매개 변수는 "T에 대한 포인터"로 조정됩니다.
그래서 int arg[]
로 조정됩니다 int* arg
.
함수 인수의 변환 :
"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
'programing tip' 카테고리의 다른 글
SQL Server의 모든 데이터베이스에있는 모든 테이블을 단일 결과 집합에 나열하려면 어떻게합니까? (0) | 2020.12.13 |
---|---|
최고의 JavaScript 이미지 처리 라이브러리는 무엇입니까? (0) | 2020.12.13 |
쉘 스크립트에서 특정 줄을 주석 처리하는 방법 (0) | 2020.12.13 |
PHP : mysql_real_escape_string이 사용자 입력을 정리하기에 충분합니까? (0) | 2020.12.13 |
정규식 오류-반복 할 사항 없음 (0) | 2020.12.13 |