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

4

3 回答 3

12

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

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]
于 2012-04-29T04:57:58.167 回答
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*).

在键盘上查看此示例:

#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
于 2012-04-29T05:27:08.843 回答
2

我一直认为传递固定大小的 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!
}

参考:有人可以解释这个给我数组大小的模板代码吗?

于 2014-11-28T09:21:53.923 回答