我有下面這段代碼,它有一個指向2D陣列的指標變數。
int main()
{
int (*ptr)[2][3] 。
printf("%u
", sizeof(ptr)); // --> 給予指標的大小=8。
printf("%u
", sizeof(*ptr)); // --> 給予陣列的大小=24,如何作業將*添加到ptr給予陣列大小。
return 0;
uj5u.com熱心網友回復:
你必須對運算子sizeof回傳的型別為size_t的值使用轉換指定器%zu。
printf("%zu
", sizeof(ptr))。
^^^^^
如果你有一個指標,如
T *p;
其中T是某種型別,那么運算式*p的型別是T。所以sizeof( *p )等同于sizeof( T )。
這個宣告
int (*ptr)[2] [3] 。
宣告了一個指向陣列型別的指標int[2][3]; 你可以用一個型別化的方法重寫宣告
typedef int T[2] [3] 。
T *ptr。
所以運算式sizeof( *ptr )等同于運算式sizeof( int[2][3] )。
uj5u.com熱心網友回復:
sizeof(ptr)給出了poiter本身的大小,在你的系統中是8
sizeof(*ptr)是給你指標ptr所參考的物件的大小。由于ptr是一個指向6整數(3x2)的2D陣列的指標,那么假設sizeof(int) == 4
24位元組。
uj5u.com熱心網友回復:
運算式 ptr的型別是int (*)[2][3](指向int的3元素陣列的2元素陣列的指標)--它是一個指標型別,所以它在你的系統中是多大的指標型別(在這個例子中是8位元組)。
運算式*ptr的型別是int [2][3] - 它是一個2x3的int陣列,意味著它的大小足以存盤6個int物件。 一個int在你的系統中是4位元組寬,總大小為24位元組。
如果sizeof的運算元是一個運算式,而不是一個型別名稱,那么它就以運算式的型別為準。 例如,運算式1的型別是int,運算式2的型別是int,運算式1 2的型別是int,所以
sizeof 1 == sizeof 2 == sizeof (1 2) == sizeof (int)
記住,sizeof是一個運算子,而不是一個函式--你只需要在運算元是一個型別名(如(int))或者運算元是一個包含優先級較低的運算子的運算式時使用括號。 例如
sizeof 1 2
將被決議為
(sizeof 1) 2
因為算術 運算子的優先級低于單數sizeof運算子,這可能不是你想要的。 然而,像
sizeof *foo[N] 。
將被決議為
sizeof (*(foo[N])
所以在這種情況下,小括號是沒有必要的。 有些人建議你無論如何都要使用小括號,這并不是壞建議;最終你會了解什么時候不需要小括號,并且可以放心地不使用。
uj5u.com熱心網友回復:
sizeof()在編譯時是已知的,由編譯器計算。 編譯器知道你有一個2x3的32位整數的型別,總共有24個位元組。 當你使用這個型別的指標時,這個指標的大小,就像64位系統中的其他指標一樣,都是8位元組。所以sizeof()任何指標的大小都是8位元組。這與編譯時的結構或預定義大小的陣列的大小無關。
注意:陣列和指標在C語言中有點誤導。如果你有一個int arr[3]的陣列,編譯器知道它的大小是3*4位元組。但如果你把它作為引數 "arr[]"傳遞給一個函式,或者只是把它賦給指標,比如 "int *ptr = &arr[0]",大小會變成8。盡管指標和陣列指向記憶體中完全相同的區域,但其型別本身是不同的。這種型別(指向位元組的指標、指向雙倍數的指標、陣列......)由編譯器維護,并用于生成正確的匯編代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/306959.html
標籤:
上一篇:從scanf()回傳多個值而不需要2個或更多的輸入?C語言
下一篇:空陣列的元素是否為NULL值?
