2012-04-29 63 views
10

这感觉就像一个真正愚蠢的事情要问,但我已经有人采取了编程课问我对工作分配一些帮助,我看到这个在他们的代码(在匈牙利命名法请无评论):函数声明中,传递固定大小的数组意味着什么?

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

其中,主要是C#程序员(我在大学里学过C和C++),我甚至都不知道你能做到。我总是告诉,并已阅读,因为,你应该有

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

我听说这位教授给了他们这一点,它的工作原理,所以什么声明一个固定大小的数组一样,甚至意味着? C++没有原始的方式知道传递给它的数组的大小(即使我认为可能已经在最新的规范中被改变)

+0

它必须知道数组的大小原生方式:这种方法。如果你告诉它阵列有多棒,它会相信它。 – 2012-04-29 04:58:10

+1

参数声明中的'25'被编译器忽略。它与'string ar_dictionary []'相同。 – 2012-04-29 04:59:10

+0

@ H2CO3没有什么功能可以对这个数字做任何事情,也没有任何方式让编译器检查是否传递给它的尺寸...... – cost 2012-04-29 05:05:17

回答

10

在一维数组中它没有意义并且被编译器。在两维或更多维数组中它可以是有用的,并且被函数用作确定矩阵(或多维数组)的行长度的方式。例如:

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

这个函数将根据指定的长度知道的arr[1][2]的地址,并且还编译器不应该接受阵列的不同尺寸用于该功能 -

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

不允许和将是一个编译器错误(克++):

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

你是什么意思函数会知道地址? – cost 2012-04-29 05:30:24

+1

在[x] [y]访问数组意味着访问y行和第x列的元素。为此,您必须知道该行的长度。 'arr [1] [2]'与'arr [2 * 10 + 1]'相同。 – WeaselFox 2012-04-29 07:59:41

5

参数声明的25由编译器忽略。这和你写下string ar_dictionary[]一样。这是因为数组类型的参数声明被隐式地调整为指向元素类型的指针。

所以以下三个函数声明是等价的:

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) 

即使在第一功能的情况下,以明确声明数组的大小,sizeof(ar_dictionary)将返回相同的值sizeof(void*)

参见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; 
} 

输出(精确值是,当然,依赖于实现,这纯粹是为了示例的目的):

4 
4 
+1

WeaselFox的答案对你有意义吗?如果它只是被一个指针腐烂,那么他所说的不应该是真的。我有点困惑 – cost 2012-04-29 05:31:28

+0

在第一个中,sizeof(ar_dictionary)会返回sizeof(void *)吗? – Spidey 2012-04-29 05:31:48

+1

多维数组的工作方式与使用单维的工作方式不同。我不确定这与什么有关;该问题仅涉及一维数组。 @cos – 2012-04-29 08:36:05

1

我总是虽然这使固定大小C++数组是C++的“半焙烤”功能。例如,忽略大小匹配或只能够指定第一个索引的大小,等等。直到最近我学这个成语:

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! 
} 

参考:Can someone explain this template code that gives me the size of an array?