declared as array of references of type float&当我声明一个函数时,我在XCode中遇到错误:
void calcCoeff(float sigma, float& ap[], float& bp[], float& an[], float& bn[]);
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我可能是什么问题?我也试过了
void calcCoeff(float sigma, float &ap[5], float &bp[5], float &an[5], float &bn[5]);
Run Code Online (Sandbox Code Playgroud)
谢谢...
问题完全如错误消息所述:float& ap[]声明一个引用数组,并且这不是C++中的合法类型,就像禁止引用和引用引用的指针一样.
如果它是合法的,你可以通过思考一系列指针来思考它意味着什么.引用在某些方面在概念上类似于指针; 引用意味着引用另一个实体,并且当引用需要运行时表示时,C++实现通常使用指针.
所以,如果你要将一个指针数组传递给一个函数,你需要构造一个初始化它:
float a, b, c;
float *arr[] = {&a, &b, &c}; // or in fictional array-of-references syntax: float &arr[] = {a, b, c};
Run Code Online (Sandbox Code Playgroud)
或者,如果您已经有一个浮点数组,并且您想要一个指向这些元素的指针数组:
float a[3];
float *b[] = {&a[0], &a[1], &a[2]); // or in fictional array-of-references syntax: float &b[] = {a[0], a[1], a[2]};
Run Code Online (Sandbox Code Playgroud)
据推测,您实际想要的是通过引用将数组传递给函数,以便函数可以写入数组,并且调用者可以看到更改.(或者只是因为你想避免复制数组).因为通常函数参数是通过值传递的,并且通过引用传递的方式是坚持&在那里你对数组类型做了同样的事情.这是一个非常好的直觉,但是C++中有一些皱纹让你感到困惑.
第一个是C++中声明的奇怪语法.您可以在其他地方阅读有关"螺旋规则"或"声明模仿使用"的内容,但只需说明它是否&"更接近"(语法上)变量名称或者更为重要float.float &arr[]是一系列参考文献.你需要几个括号来使符号更接近变量:float (&arr)[]声明对数组的引用.
接下来,不幸的是,C++从C继承了一些奇怪的行为,旨在使数组和指针几乎可以互换.在您的情况下相关的行为是,如果您声明一个采用数组参数的函数:
void foo(int arr[], int size);
Run Code Online (Sandbox Code Playgroud)
该语言明确指出该类型被"调整"为指针.结果如下:
void foo(int *arr, int size);
Run Code Online (Sandbox Code Playgroud)
这意味着,数组不表现得像值类型.尝试按值传递数组不会导致传递给函数的数组的可修改副本; 相反,该函数有效地通过引用接收数组.
第二个结果是数组参数不需要具有完整的数组类型,即可以省略数组大小,因为调整了数组类型并且从不使用大小.这意味着如果您天真地将未指定大小的"数组参数"转换为对数组的引用,则除了添加之外,还必须指定大小&.float (&arr)[10].
在我看来,使用原始数组作为参数是非常不受欢迎的.首先是因为它丢弃了类型信息:
void foo(int arr[10]) { // same as void foo(int *arr)
int x = arr[9];
}
int bar[3];
foo(bar); // no compile error! the special array rules discarded the size of the array
Run Code Online (Sandbox Code Playgroud)
并且因为原始数组与其他内置类型不一致,所有类型都具有值语义.由于这些原因,应避免使用原始数组.相反,您可以使用std::array它避免内置数组的所有"特殊"规则,因此应该像内置数组一样运行.
void foo(std::array<int, 10> arr); // Takes arr by value, modifications will not be visible externally
std::array<int, 3> bar;
foo(bar); // compile error
Run Code Online (Sandbox Code Playgroud)
如果你需要一个动态大小的数组,那么你可以使用它std::vector.