2012-04-29 23 views
10

này cảm thấy như là một điều thực sự ngu ngốc để hỏi, nhưng tôi đã có người tham gia một lớp lập trình hỏi tôi đối với một số giúp đỡ về chuyển nhượng và tôi thấy điều này trong mã của họ (Chưa có cảm nhận về các ký hiệu Hungarian xin vui lòng):Trong một khai báo chức năng, những gì đi qua một mảng kích thước cố định biểu thị?

void read_dictionary(string ar_dictionary[25], int & dictionary_size) {... 

Mà, chủ yếu là một lập trình viên C# (tôi đã học về C và C++ ở đại học) Tôi thậm chí không biết bạn có thể làm. Tôi đã luôn nói, và đã đọc vì bạn mà đang phải có

void read_dictionary(string ar_dictionary[], int ar_dictionary_size, int & dictionary_size) {... 

Tôi nói rằng vị giáo sư cho họ này và rằng nó hoạt động, vì vậy những gì không khai báo một mảng kích thước cố định như thế thậm chí có ý nghĩa ? C++ không có cách nào để biết kích thước của một mảng được truyền cho nó (ngay cả khi tôi nghĩ rằng có thể đã được thay đổi trong thông số mới nhất)

+0

Nó có cách tự nhiên để biết kích thước mảng : phương pháp này. Nếu bạn nói nó tuyệt vời như thế nào là mảng, nó sẽ tin rằng nó được. –

+1

'25' trong khai báo tham số bị bỏ qua bởi trình biên dịch. Nó giống như 'string ar_dictionary []'. –

+0

@ H2CO3 Không có chức năng nào có thể làm với con số đó, cũng như bất kỳ cách nào để trình biên dịch kiểm tra xem cái gì đang được truyền cho nó có phải là kích thước không ... – cost

Trả lời

10

Trong mảng một chiều Nó không có ý nghĩa và bị bỏ qua bởi trình biên dịch. Trong một mảng hai hoặc nhiều chiều Nó có thể hữu ích và được sử dụng bởi hàm như một cách để xác định chiều dài hàng của ma trận (hoặc mảng đa chiều). ví dụ:

int 2dArr(int arr[][10]){ 
    return arr[1][2]; 
} 

chức năng này sẽ biết địa chỉ của arr[1][2] theo chiều dài quy định, và cũng là trình biên dịch không nên chấp nhận kích thước khác nhau của các mảng cho chức năng này -

int arr[30][30]; 
2dArr(arr); 

không được phép và sẽ là lỗi trình biên dịch (g ++):

error: cannot convert int (*)[30] to int (*)[10] 
+0

Bạn có ý nghĩa gì khi hàm này biết địa chỉ? – cost

+1

truy cập mảng tại [x] [y] có nghĩa là truy cập phần tử tại hàng y và cột x. cho điều này bạn phải biết chiều dài của hàng là bao nhiêu. 'arr [1] [2]' giống với 'arr [2 * 10 + 1]'. – WeaselFox

5

25 trong khai báo tham số bị bỏ qua bởi trình biên dịch. Nó giống như khi bạn viết string ar_dictionary[]. Điều này là do một khai báo tham số của kiểu mảng được điều chỉnh hoàn toàn cho một con trỏ đến kiểu của phần tử.

Vì vậy, ba lời tuyên bố hàm sau là tương đương:

void read_dictionary(string ar_dictionary[25], int& dictionary_size) 
void read_dictionary(string ar_dictionary[], int& dictionary_size) 
void read_dictionary(string *ar_dictionary, int& dictionary_size) 

Ngay cả trong trường hợp của các chức năng đầu tiên, với kích thước của mảng khai báo rõ ràng, sizeof(ar_dictionary) sẽ trả về giá trị tương tự như sizeof(void*).

Xem this sample on Codepad:

#include <string> 
#include <iostream> 

using namespace std; 

void read_dictionary(string ar_dictionary[25], int& dictionary_size) 
{ 
    cout << sizeof(ar_dictionary) << endl; 
    cout << sizeof(void*) << endl; 
} 

int main() 
{ 
    string test[25]; 
    int dictionary_size = 25; 
    read_dictionary(test, dictionary_size); 

    return 0; 
} 

Output (giá trị chính xác là, tất nhiên, thực hiện phụ thuộc, điều này là hoàn toàn cho mục đích ví dụ):

4 
4 
+1

Câu trả lời của WeaselFox có phù hợp với bạn không? Nếu nó chỉ bị hư hỏng với một con trỏ, thì những gì anh ta nói không nên đúng. Tôi là một chút bối rối – cost

+0

Trong một đầu tiên, sizeof (ar_dictionary) sẽ trả về sizeof (void *) quá? – Spidey

+1

Mảng có nhiều thứ nguyên hoạt động khác với các thứ nguyên có một chiều. Tôi không chắc điều đó liên quan gì đến bất cứ điều gì; câu hỏi chỉ liên quan đến mảng một chiều. @cos –

1

Tôi luôn dù rằng qua kích thước cố định C++ mảng là một "nửa nướng" tính năng của C + +. Ví dụ, bỏ qua khớp kích thước hoặc chỉ có thể để xác định kích thước chỉ mục đầu tiên, vv ... Cho đến gần đây tôi học thành ngữ này:

template<size_t N1, size_t N2> // enable_if magic can be added as well 
function(double(&m)[N1][N2]){ 
    ... do something with array m...knowing its size! 
} 

tham khảo: Can someone explain this template code that gives me the size of an array?

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