在我关于c ++的教科书中,我有以下代码示例:
using std::cout;
using std::endl;
int main() {
int aArr[4] = { 3,4,2,3 };
int bArr[3] = { 2,3,1 };
cout << "Append: " << endl;
printArray(aArr, 4); cout << " + "; printArray(bArr, 3);
int* cArr = append(&aArr, bArr);
cout << " = "; printArray(cArr, 7); cout << endl;
return 0;
}
“&amp;”在main中追加调用中“aArr”前面的符号表示传递aArr的地址,或者传递对aArr的引用。
然后问题要求我实现一个函数append,它接受两个数组:第一个数组(在第一个参数中),大小为4,数组指针,第二个数组(在第二个参数中),大小为3,引用和返回一个指向大小为7的数组的指针。我已将该函数声明为(在相应的头文件中)
int* append( int foo[4], int (&secondArray) [3] );
作者是否可能错放了“&amp;”的顺序append方法中的符号(它应该在“bArr”之前)?
答案 0 :(得分:1)
编译器可以在这种情况下帮助你。
让我们假设这是你的追加函数的函数原型:
int* append( int foo[4], int (&secondArray) [3]);
我可以用这么简单的代码测试一下:
int* append( int foo[4], int (&secondArray) [3])
{
return 0;
}
int main() {
int aArr[4] = { 3,4,2,3 };
int bArr[3] = { 2,3,1 };
int* cArr = append(&aArr, bArr);
return 0;
}
但是编译器并不喜欢这样,失败了这个错误:
test.cpp(9): error C2664: 'int *append(int [],int (&)[3])':
cannot convert argument 1 from 'int (*)[4]' to 'int []'
正如您所看到的那样,它不像第9行的&aArr
参数1,因为它与第1行的函数定义的参数1不匹配。从错误消息中它甚至足够好说明为什么它认为自己不排队。
现在使用编译器中的提示很明显该函数应该看起来像这样:
int *append(int (*foo)[4], int secondArray[3])
{
return 0;
}
int main() {
int aArr[4] = { 3,4,2,3 };
int bArr[3] = { 2,3,1 };
int* cArr = append(&aArr, bArr);
return 0;
}
通过这种更改,编译器很乐意接受正确的代码。
现在比较两者你可以看到区别在于第一种情况,第一个参数作为4个整数的数组传递,而在第二种情况下,它作为四个整数数组的地址传递。
从英语中你可以看出这些是两个非常不同的东西。
编辑:以下是该示例的扩展,展示了如何访问函数内的数据。
#include <stdio.h>
int *append(int (*foo)[4], int secondArray[3] )
{
int *foo1 = *foo;
for (int i = 0; i < 4; ++i)
{
printf("foo: %d\n", foo1[i]);
}
for (int j = 0; j < 3; ++j)
{
printf("secondArray: %d\n", secondArray[j]);
}
return 0;
}
int main() {
int aArr[4] = { 3,4,2,3 };
int bArr[3] = { 12,13,11 };
int* cArr = append(&aArr, bArr);
return 0;
}
编译运行此代码会产生以下输出:
foo: 3
foo: 4
foo: 2
foo: 3
secondArray: 12
secondArray: 13
secondArray: 11