编译器可以帮助你解决这种情况。
让我们假设这是函数原型为您的附加功能:
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 []'
正如你可以看到它不喜欢&aArr
参数1在第9行,因为它与第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
&aArr和aArr是实际上,对于静态数组特例同样的事情。 –
阅读*参考*。在不同的情况下,会员意味着不同的事物。在变量声明的上下文中(例如参数声明),它不是地址运算符,而是表示变量是*引用*。 –
@PierreEmmanuelLallemant不,他们事实上不是一回事! – Barry