在函数声明中,传递固定大小的数组表示什么
In a function declaration, what does passing a fixed size array signify?
这感觉像是一件非常愚蠢的事情,但是我有一个上编程课的人向我寻求作业方面的帮助,我在他们的代码中看到了这一点(请不要对匈牙利符号发表评论):
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!
}
参考:有人可以解释这个给我数组大小的模板代码吗?
相关文章:
- 通过JNI传递数据数组的最快方法是什么
- 讨论 - 创建矩阵时的数组与向量的向量 - 什么是最实用的选择
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- 当该数组的索引中没有元素时,指针指向什么?
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 从字符数组的元素中减去'a'是什么意思
- 这种用于查找连续子数组中最大和的递归算法有什么优势吗?
- 字符数组前面的加号是什么意思?
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 在C++中,建议通过数组循环的方式是什么?
- C++ 未初始化的本地(非全局)int 数组中的元素类型到底是什么?
- C++数组中的初始值设定项是什么?
- 如果我在字符数组上使用 close() 会发生什么?
- 指向数组基址的指针而不是指向第一个元素的指针有什么优点?
- 使用STL对用户输入数组进行排序的错误有什么解决方案吗?
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 我在 2D 数组的动态内存分配中遇到了一些奇怪的代码C++? 请解释一下这是什么?
- 将 std::unique_ptr 重置为指向数组的指针有什么问题?