아하
생활

생활꿀팁

프알못
프알못

C/C++ 배열은 어떤 타입인가요?

#include <iostream> #include <typeinfo> using std::cout; using std::endl; template<typename T> decltype(auto) type(T t) { return typeid(t).name(); } #define printType(v) cout << typeid(v).name() << endl; int main() { int arr[10][10]; printType(arr) // A10_A10_i (int[10][10]) auto copy = arr; printType(copy) // PA10_i (int(*)[10]) auto reference = &arr; printType(reference) // PA10_A10_i (int(*)[10][10]) auto dereferenced = *reference; printType(dereferenced) // PA10_i (int(*)[10]) auto byPointer = type<int (*)[10]>(arr); cout << byPointer << endl; // PA10_i (int(*)[10]) auto byArray = type<int[999][10]>(arr); cout << byArray << endl; // PA10_i (int(*)[10]) auto byAuto = type(arr); cout << byAuto << endl; // PA10_i (int(*)[10]) auto referenceByAuto = type(&arr); cout << referenceByAuto << endl; // PA10_A10_i (int(*)[10][10]) return 0; }

위 코드에서 int arr[10][10];으로 int[10][10] 타입의 변수 arr을 선언했습니다.

그러나 &arr은 int(*)[10][10] 타입, *&arr이나 arr로부터 만든 변수도 int(*)[10] 타입으로

어떤 방법으로도 arr로부터 int[10][10] 타입의 변수를 선언&초기화하지 못했습니다.

(decltype(auto) decltypeAuto = arr;는 오류 (array initializer must be an initializer list))

배열은 정확히 어떤 타입인가요? 포인터와 무엇이 다른가요?
배열 타입의 변수는 어떻게 다른 변수로부터 초기화할 수 있나요?

&arr은 int(*)[10][10]인데 *&arr은 왜 int[10][10]이 아닌 int(*)[10]인가요?
배열, 배열 포인터, 포인터 배열을 참조/역참조할 때는 어떤 규칙을 따르나요?

1개의 답변이 있어요!