ProgramingTip

함수에 특정 크기의 배열 변수가있는 경우 포인터로되는 이유는 무엇입니까?

bestdevel 2020. 11. 18. 09:31
반응형

함수에 특정 크기의 배열 변수가있는 경우 포인터로되는 이유는 무엇입니까?


다음 프로그램이 주어지면

#include <iostream>

using namespace std;

void foo( char a[100] )
{
    cout << "foo() " << sizeof( a ) << endl;
}

int main()
{
    char bar[100] = { 0 };
    cout << "main() " << sizeof( bar ) << endl;
    foo( bar );
    return 0;
}

출력

main() 100
foo() 4
  1. 배열이 첫 번째 요소에 대한 포인터로 전달되는 이유는 무엇입니까?
  2. C의 유산입니까?
  3. 표준은 무엇을 말합니까?
  4. C ++의 엄격한 유형 사원이 삭제 된 이유는 무엇입니까?

예, C에서 상속되었습니다. 기능 :

void foo ( char a[100] );

지정된 변수가 포인터가 조정되어 다음과 같이됩니다.

void foo ( char * a );

배열 유형을 유지하려는 배열에 대한 참조를 전달해야합니다.

void foo ( char (&a)[100] );

C ++ '03 8.3.5 / 3 :

... 함수 유형은 다음 규칙에 따라 결정됩니다. 각 변수의 유형은 자체 decl-specifier-seq 및 선언자에서 결정됩니다. 각 매개 변수의 유형을 결정한 후, "T의 배열"또는 "T를 반환하는 함수"가 되도록 조정됩니다 ....

구문을 설명하려는 비용 :

Google에서 "오른쪽 왼쪽"을 확인하십시오. 여기 에서 한 가지 설명을 찾았 습니다 .

이 예제에는 다음과 같이 적용됩니다.

void foo (char (&a)[100]);

식별자 'a'에서 시작

'a'는

오른쪽으로 이동-우리 )(. 왼쪽으로 이동하면지나갑니다&

'a'는 참조입니다.

&우리는 도달에 도달 한 후 (다시 뒤집어 오른쪽을 봅니다. 이제 우리는[100]

'a'는 100의 배열에 대한 참조입니다.

그리고 우리가 할 때까지 방향을 다시 바꿉니다 char.

'a'는 100 자 배열에 대한 참조입니다.


예. C 및 C ++에서는 배열을 함수에 없습니다. 바로 그 방법입니다.

어쨌든 평범한 배열을하는 이유는 무엇입니까? boost/ std::tr1::array/ std::array또는 std::vector?

그러나 임의 길이의 배열에 대한 참조를 함수 템플릿에 있습니다 . 내 머리 위로 :

template< std::size_t N >
void f(char (&arr)[N])
{
  std::cout << sizeof(arr) << '\n';
}

-정적 배열과 함수 포인터에 사용되는 C / C ++ 용어 멋진 단어가 붕괴 . 다음 코드를 고려하십시오.

int intArray[] = {1, 3, 5, 7, 11}; // static array of 5 ints
//...
void f(int a[]) {
  // ...
}
// ...
f(intArray); // only pointer to the first array element is passed
int length = sizeof intArray/sizeof(int); // calculate intArray elements quantity (equals 5)
int ptrToIntSize = sizeof(*intArray); // calculate int * size on your system

참고 URL : https://stackoverflow.com/questions/1328223/when-a-function-has-a-specific-size-array-parameter-why-is-it-replaced-with-ap

반응형