2011-12-11 48 views
5

Có cách nào để lấy chiều dài của một mảng khi tôi chỉ biết một con trỏ trỏ tới mảng không?Lấy chiều dài của một mảng bằng cách sử dụng con trỏ

Xem ví dụ sau

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 

(Đây là một snipplet từ Arduino Mã - Tôi xin lỗi, tôi không "nói chuyện" C thực).

Trả lời

11

Câu trả lời dễ dàng là không, bạn không thể. Bạn có thể muốn giữ một biến trong bộ nhớ lưu trữ số lượng các mục trong mảng.

Và có câu trả lời không dễ dàng. Có một cách để xác định độ dài của một mảng, nhưng bạn sẽ phải đánh dấu phần cuối của mảng bằng một phần tử khác, chẳng hạn như -1. Sau đó, chỉ cần lặp qua nó và tìm thấy yếu tố này. Vị trí của phần tử này là độ dài. Tuy nhiên, điều này sẽ không hoạt động với mã hiện tại của bạn.

Chọn một trong các bên trên.

+3

+1 Đây là một trong những điều mà C hút. :) –

+1

@WTP Giống với C++, ngoại trừ 'std :: vector' sẽ xử lý nó cho bạn. –

1

Bạn không thể và bạn không nên cố gắng suy ra chiều dài mảng sử dụng con trỏ số học

nếu trong lớp C++ sử dụng vector

3
  • Bạn có thể suy ra độ dài của một mảng nếu bạn có một biến mảng.
  • Bạn không thể suy ra độ dài của một mảng nếu bạn chỉ có một con trỏ đến nó.
1

Bạn có thể nếu bạn trỏ toàn bộ mảng và KHÔNG trỏ đến phần tử đầu tiên như:

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

Ngoại trừ trong trường hợp đó bạn phải biết chiều dài, mà làm cho một đếm khá vô dụng. –

4

Cũng làm một dự án Arduino đây ... Mọi người trên internet dường như khẳng định nó không thể để làm điều này ... và chưa lừa lâu đời nhất trong cuốn sách dường như chỉ làm việc tốt với null chấm dứt mảng ...

ví dụ cho con trỏ char:

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

ma thuật ...

+1

Đối với mảng char, bạn có thể dễ dàng nhận được kích thước của nó bằng cách sử dụng strlen() vì nó sử dụng cùng phương thức như được hiển thị ở trên. Nhưng đối với mảng char số, đơn giản là bạn không thể. –

Các vấn đề liên quan