2011-12-11 21 views
5

當我只知道指向數組的指針時,是否有辦法獲取數組的長度?使用指針獲取數組的長度

請看下面的例子

int testInt[3]; 
testInt[0] = 0; 
testInt[1] = 1; 
testInt[2] = 1; 

int* point; 
point = testInt; 

Serial.println(sizeof(testInt)/sizeof(int)); // returns 3 
Serial.println(sizeof(point)/sizeof(int)); // returns 1 

(這是Arduino的守則snipplet - 對不起,我不 「說話」 真正的C)。

回答

11

簡單的答案是否定的,你不能。你可能會想要在內存中保存一個變量來存儲數組中的項目數量。

還有一個不太容易的答案。有一種方法可以確定數組的長度,但是爲此您必須用另一個元素標記數組的末尾,例如-1。然後通過它循環並找到這個元素。這個元素的位置是長度。但是,這不適用於您當前的代碼。

選擇上述之一。

+3

+1這是C吸吮的東西之一。 :) – 2011-12-11 14:25:08

+1

@WTP對於C++來說是相同的,只是'std :: vector'會爲你處理它。 –

1

你不能你不應該嘗試使用指針運算

如果在C++使用向量類

3
  • 可以推斷數組的長度,如果你有一個數組變量推導出陣列的長度。
  • 如果您只有一個指針,則無法推斷數組的長度。
1

你可以,如果你點了整個陣列,而不要指向像第一個元素:

int testInt[3]; 
int (*point)[3]; 
point = testInt; 

printf("number elements: %lu", (unsigned long)(sizeof*point/sizeof**point)); 
printf("whole array size: %lu", (unsigned long)(sizeof*point)); 
+0

除了這種情況下,你必須已經知道長度,這使得一個計數很無用。 –

4

而且在這裏做一個Arduino項目... 互聯網上的所有人似乎堅持認爲,這是不可能的爲字符指針做到這一點... ,但書中最古老的伎倆似乎只是正常工作與空值終止陣列...

例如:

int getSize(char* ch){ 
     int tmp=0; 
     while (*ch) { 
     *ch++; 
     tmp++; 
     }return tmp;} 

魔法......

+1

對於char數組,由於它使用與上面所示相同的方法,因此可以使用strlen()輕鬆獲取其大小。 但是對於數字字符數組,只是你不能。 –