2015-10-17 100 views
0

我從我的講師那裏聽說,sizeof(某個指針)在機器中總是相等的。例如,如果是64位,則所有指針都是8字節,32位是4字節。所以,我喜歡用sizeof當我想像數組混淆確定元素號

int arr[] = {2, 5, -1, 10, 9}; 
int size = sizeof(arr)/sizeof(int) 

我假定上面的代碼的int需要4指定數組的大小,因此20/4給出arr元素的個數。

int arr[] = {2, 5, -1, 10, 9}; 
int size = sizeof(arr)/sizeof(int*) 

我還以爲sizeof(some pointer)需要4,所以20/4再次給出了arr元素的個數。

我很困惑,當我將它應用於double陣列。我認爲它不應該工作。但是,它的工作。

double arr[] = {2, 5, -1, 10, 9}; 
int size = sizeof(arr)/sizeof(double*); 

如果每個指針在機器中的大小相同,結果怎麼樣?可以解釋這個問題嗎? 編輯

予混合起來除以* ARR和雙指針

+0

也許你應該發佈你期望的和爲什麼,以及你得到什麼。因爲現在你的問題不是很清楚。 – juanchopanza

+0

你難以理解的地方在哪裏? – snr

+0

只有你所期望的和爲什麼,你得到了什麼,以及你實際要問什麼。 – juanchopanza

回答

5

指針的大小不是double陣列中的元件的類型的大小,這是因爲元件是double不是指針。

當您申請sizeof到一個數組它給陣列的字節大小,在

double arr[] = {2, 5, -1, 10, 9}; 

情況下,它

5 * sizeof(double) 

sizeof(double) != sizeof(double *)。因此,要真正得到數組中元素的個數,你需要

sizeof(arr)/sizeof(double); 

而是使之更易於維護,你可以問元素的類型的大小這樣

sizeof(arr)/sizeof(*arr); 

sizeof(arr)/sizeof(arr[0]); 

此外,不要依賴此方法來確定數組中元素的數量。請注意,在運行時,無法從中的陣列本身知道它,因爲它不與數組一起存儲。如果要跟蹤元素數量,則需要存儲該值。

雖然這可能看起來很討厭,當你第一次想到它,以經驗,你應該知道,這是更好的方式。因爲它可以讓你完全控制你的程序必須處理的數據,而且一旦你習慣了它,就很難相信只給你像python的len運算符這樣的數組長度的語言。

+0

@cup你沒有刪除你的答案,但你不應該把結果轉換爲「int」,我可以知道你爲什麼這麼做嗎? –

+0

不是'sizeof(int)<= sizeof(int *)'和'sizeof(double)<= sizeof(double *)'是否類似,對於其他數據類型? –

+0

'sizeof(int)'很可能小於或等於'sizeof(int *)',但'sizeof(double)'肯定大於或等於'sizeof(double *)'。 –