在函数声明中,传递固定大小的数组表示什么

In a function declaration, what does passing a fixed size array signify?

本文关键字:数组 什么 表示 声明 函数      更新时间:2023-10-16

这感觉像是一件非常愚蠢的事情,但是我有一个上编程课的人向我寻求作业方面的帮助,我在他们的代码中看到了这一点(请不要对匈牙利符号发表评论):

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

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

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]
编译器

将忽略参数声明中的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
我一直

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

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

相关文章: