T*我最近在閱讀和之間的區別T[size], T 是型別,這讓我很好奇,所以我在玩它。
int main()
{
int a[10];
using int10arrayPtr_t = int(*)[10];
int10arrayPtr_t acopy = a;
}
在上面的代碼中,int10array_t acopy = a;是一個錯誤訊息
error C2440: 'initializing':
cannot convert from 'int [10]' to 'int10array_t'
這編譯:
int main()
{
int a[10];
using int10arrayPtr_t = int*;
int10arrayPtr_t acopy = a;
}
型別不是int(*)[10]更接近 int a[10];than的型別int*嗎?那么為什么它不允許第一種情況呢?
uj5u.com熱心網友回復:
您需要明確地獲取地址,例如
int10arrayPtr_t acopy = &a; // acopy is a pointer to array containing 10 ints
// ^
第二種情況有效,因為陣列可能會衰減為指標,因為a它可以int*隱式轉換為,并且acopy是指向的指標int(請注意,它不是指向陣列的指標)。
uj5u.com熱心網友回復:
在您的第一個示例中,該符號是“指向整數int10arrayPtr_t陣列的指標”的別名。10在您的第二個示例中,相同的符號是“指向單個整數的指標”的別名。那是完全不同的事情。
此外,陣列確實會衰減為指向其第一個元素的指標,但它是指向陣列單個元素的指標。ie plaina會衰減到&a[0],其中有型別int*。要獲得指向陣列的指標,您需要對整個陣列使用指向運算子&,如&a.
uj5u.com熱心網友回復:
運算式中使用的陣列指示符(極少例外)被隱式轉換為指向其第一個元素的指標。
因此,例如,如果您有一個陣列
T a[N];
那么你可以寫
T *p = a;
因為由于隱式轉換,上述宣告相當于
T *p = &a[0];
如果您將運算子 & 的地址應用于陣列,那么您將獲得一個指標解參考,您將獲得原始物件。
例如
T a[N];
T ( *p )[N] = &a;
std::cout << sizeof( *p ) << '\n';
輸出陳述句將給出陣列 a 的大小。
這是一個演示程式。
#include <iostream>
#include <iomanip>
#include <type_traits>
int main()
{
const size_t N = 10;
using T = int;
T a[N];
T *p = a;
std::cout << "std::is_same_v<T &, decltype( *p )> is "
<< std::boolalpha << std::is_same_v<T &, decltype( *p )>
<< '\n';
std::cout << "sizeof( *p ) = " << sizeof( *p ) << '\n';
T( *q )[N] = &a;
std::cout << "std::is_same_v<T ( & )[N], decltype( *q )> is "
<< std::boolalpha << std::is_same_v<T ( & )[N], decltype( *q )>
<< '\n';
std::cout << "sizeof( *q ) = " << sizeof( *q ) << '\n';
}
程式輸出為
std::is_same_v<T &, decltype( *p )> is true
sizeof( *p ) = 4
std::is_same_v<T ( & )[N], decltype( *q )> is true
sizeof( *q ) = 40
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/454255.html
上一篇:如何拆分具有切割值的鏈表?
