这感觉真是一个非常愚蠢的问题,但我有人参加编程课程,请求我在作业上提供一些帮助,我在他们的代码中看到了这一点(请不要对匈牙利符号发表评论):
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 :(得分: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*)
相同的值。
#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?