2010-07-20 2 views
4

다음 함수의 출력은 "int *"이며, 이는 형식 매개 변수가 정수 포인터로 변환됨을 의미합니다. 이 디자인에 필요한 이유가 있습니까? 배열 형식을 예약 할 수없는 이유는 무엇입니까?함수의 형식 매개 변수 배열 유형이 포인터로 변환 된 이유는 무엇입니까?

// the output is "int *" 
#include<typeinfo> 
void Func(int ar[5]) 
{ 
    printf("%s\n", typeid(ar).name(); 
} 
int main() 
{ 
    int ar[5]; 
    Func(ar); 
    return 0; 
} 
+0

또한이 답변을 참조하십시오 : http://stackoverflow.com/questions/3264611/arguments-in-a-function-prototype/3264641#3264641 –

답변

7

이 디자인에 필요한 이유가 있나요?

이 어쨌든에 의해 값 배열을 통과 할 수 없기 때문에이 편리했다 C. 기발한 1에서 역사적 짐이다. 당신이 유형을 유지하려면

, 당신은 참조 또는 포인터를 사용할 수 있습니다

void Func(int (&ar)[5]); 

또는 임의의 크기의 배열을 받아 템플릿 함수를 사용하여 :

template<std::size_t N> void Func(int (&ar)[N]); 
+0

@sbi :'template void func (T (& ar) [N])'이 더 좋습니다. : P –

+0

& @Prasoon : 사람들은 종종 다른 _types_를 사용하기 위해 무언가가 필요할 때 템플릿을 생각하지만 대개 비 형식 템플릿 인수는 잊어 버립니다. – sbi

2

내가 좋아하는 것까지를 이것을 "어레이 붕괴 (array decay)"라고 부르며 여기에 대한 좋은 토론이 있습니다 :

http://www.lysator.liu.se/c/c-faq/c-2.html

C++에서 원시 배열을 사용하는 것은 약간 "c 스타일"입니다. True C++ 숙련자는 std :: vector를 사용하는데, decay와 타이핑 문제가 없습니다. 그럼에도 불구하고 레거시 코드는 원시 배열로 가득 차며 "C++"컴파일러는 호환성을 제공하기 위해 "C"규칙하에 재생해야합니다.

관련 문제