在函数声明中,传递固定大小的数组意味着什么?

时间:2012-04-29 04:54:31

标签: c++ arrays arguments

这感觉真是一个非常愚蠢的问题,但我有人参加编程课程,请求我在作业上提供一些帮助,我在他们的代码中看到了这一点(请不要对匈牙利符号发表评论):

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 ++没有本地方式知道传递给它的数组的大小(即使我认为在最新的规范中可能已经改变了)

3 个答案:

答案 0 :(得分:11)

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

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

此函数将根据指定的长度知道arr[1][2]的地址,并且编译器也不应接受此函数的不同大小的数组 -

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

是不允许的,并且是编译器错误(g ++):

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

答案 1 :(得分: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

答案 2 :(得分:2)

我总是认为通过固定大小的C ++数组是一个半生的&#34; 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?