반응형
함수에 특정 크기의 배열 변수가있는 경우 포인터로되는 이유는 무엇입니까?
다음 프로그램이 주어지면
#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
- 배열이 첫 번째 요소에 대한 포인터로 전달되는 이유는 무엇입니까?
- C의 유산입니까?
- 표준은 무엇을 말합니까?
- 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
반응형
'ProgramingTip' 카테고리의 다른 글
Angular2의 (keyup) 옵션은 무엇입니까? (0) | 2020.11.18 |
---|---|
HTTP POST / GET 요청에 대해 ASP.NET ASMX 웹 서비스 활성화 (0) | 2020.11.18 |
인증서 구조 의미론 (0) | 2020.11.18 |
실제 장치에서 디버그하는 방법 (Eclipse / ADT 사용) (0) | 2020.11.18 |
ImageView의 기본 ScaleType은 무엇입니까? (0) | 2020.11.18 |