关于数组类型的问题
Questions on the type of an array
假设我有一个函数
void function(double p[2]) {
cout << p[0] << " " << p[1] << endl;
}
如果我尝试下面的代码
double a[1] = {1};
double b[2] = {2, 3};
double c[3] = {4, 5, 6};
function(a);
function(b);
function(c);
我得到了像
这样的东西1 2.0778e-317
2 3
4 5
换句话说,2
似乎被完全忽略,所有3个数组无论如何都被传递给函数。
下列内容完全相同吗?
void function(double p[2])
void function(double p[])
void function(double *p)
如果它们是,是否有任何方法使函数只接受特定长度或至少特定长度的数组?我问的原因是a
, b
和c
的类型似乎不一样。(例如,typeid(a).name()
和typeid(b).name()
会得到不同的结果)。
它们是一样的。数组函数参数将调整为指针。所有与数组长度有关的信息都将丢失。
如果你试图定义这三个函数,你会得到多个定义错误:
void function(double p[2]) {} // defines void function(double*)
void function(double p[]) {} // ERROR
void function(double *p) {} // ERROR
这个令人困惑的语言特性继承自c。
要强制函数只接受特定类型的数组参数,可以使用对array的引用:
void function(const double(&p)[2]);
注意参数调整与数组衰减不同。数组衰减是当您以数组名称作为参数调用function
时发生的,或者当您简单地将数组赋值给指针时发生的。
double a[42] = {};
function(a); // a decays to double*
double * b = a; // a decays to double*
相关文章:
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 指针问题:从不兼容的类型"int"分配给"int *"
- 特征返回类型的 pybind11 问题
- 对齐C++字符串类型问题 std::字符串到 TStr
- C 中的类型问题
- dllimport类型问题
- 变量类型问题
- 并排定义指针和类型问题
- C++对数据类型问题
- B-树搜索引用子数据类型问题
- 协议缓冲区,让C#与C++对话:类型问题和模式问题
- 传递类成员函数:类型问题
- 使用受限函数时,尾随返回类型问题
- 如何正确使用模板?我在使用模板时遇到数据类型问题<>
- 链表输入类型问题
- 无序映射:自己的值类型问题
- 将windows c++项目链接到boost命令行体系结构类型问题
- 有数据类型问题的c++阶乘函数
- C++返回类型问题