배열이 C ++ 함수의 함수 인수에서 포인터로 간주되는 이유는 무엇입니까? 여기에 내 우려를 설명하기위한 몇 가지 코드 스 니펫이 있습니다.
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
void test(uint32_t x[3])
{
cout << "Inside test : "<< sizeof(x) << endl;
}
int main()
{
uint32_t n[3];
cout << "Size of array in bytes : " << sizeof(n) << endl;
test(n);
return 0;
}
이것은 내가 얻는 출력입니다.
Size of array in bytes : 12
Inside test : 4
첫 번째 경우에 나는 배열의 실제 크기를 얻지 만, test()
호출 될 때 출력은 sizeof(uint32_t *)
.
이 동작의 이유는 무엇입니까?
모든 도움에 감사드립니다!
이것은 C99 표준 6.3.2.1/3 기타 피연산자-L 값, 배열 및 함수 지정자입니다.
sizeof 연산자 또는 단항 & 연산자의 피연산자이거나 배열을 초기화하는 데 사용되는 문자열 리터럴 인 경우를 제외하고 ''array of type ''유형을 가진 표현식은 ''pointer to 유형의 표현식으로 변환됩니다. type ''은 배열 객체의 초기 요소를 가리키며 lvalue가 아닙니다.
그리고 이것은 C ++ 표준입니다. 배열에서 포인터로 변환.
"NT의 배열"또는 "T의 알 수없는 범위의 배열"유형의 lvalue 또는 rvalue는 "T에 대한 포인터"유형의 rvalue로 변환 될 수 있습니다.
이것은 C ++에서 배열을 포인터로 전달하는 데 필수가 아니며 참조로 붙여 넣을 수 있습니다.
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
void test(uint32_t (&x)[3])
{
cout << "Inside test : "<< sizeof(x) << endl;
}
int main()
{
uint32_t n[3];
cout << "Size of array in bytes : " << sizeof(n) << endl;
test(n);
return 0;
}
산출
Size of array in bytes : 12
Inside test : 12
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다