关于将指向数组的指针作为函数形参的混淆
Confusion about pointer to an array as a function parameter
在我的关于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;
}
在main中调用append时,"aArr"前面的"&"符号是否表示传递了aArr的地址,或者传递了对aArr的引用?
问题然后要求我实现一个函数append,它接受两个数组:第一个数组(在第一个参数中)通过数组指针大小为4,第二个数组(在第二个参数中)通过引用大小为3,并返回一个指向大小为7的数组的指针。我已经将该函数声明为(在适当的头文件中)
int* append( int foo[4], int (&secondArray) [3] );
作者是否在append方法中放错了"&"符号的顺序(它应该在"bArr"前面)?
编译器可以在这种情况下帮助你。
让我们假设这是你的追加函数的函数原型:
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个整数数组传递,而在第二种情况下,它作为4个整数数组的地址传递。
从英语中你可以看出这是两种完全不同的东西。
EDIT:下面是该示例的扩展,展示了如何访问函数内的数据。
#include <stdio.h>
int *append(int (*foo)[4], int secondArray[3] )
{
int *foo1 = *foo;
for (int i = 0; i < 4; ++i)
{
printf("foo: %dn", foo1[i]);
}
for (int j = 0; j < 3; ++j)
{
printf("secondArray: %dn", 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
相关文章:
- 使用mem_fun_ref if成员函数需要多个形参
- 哪个模板形参在boost::shared_ptr构造函数中使用一个原始指针
- 如何在编译时通过模板形参默认值的名称/指针获取函数的类型
- 哪种方法更适合为函数提供编译时间常数?函数实参与模板形参
- 包含void*结构的函数的Const正确性和形参
- 将函数形参的实参解包到c++模板类
- c++ const函数形参.有没有一种方法可以只声明函数的单个签名?
- 关于将指向数组的指针作为函数形参的混淆
- 将非const引用使用auto-keyword声明的lambda作为实参传递给std::函数形参类型
- 作为函数形参传递的Vector初始化器列表
- 指向函数形参的指针vs函数形参
- 在模板化类和函数上下文中以默认值作为函数形参的函子:-)
- 带std::函数形参的重载操作符
- 作为Const引用的函数形参
- Const对象作为函数形参
- 函数形参中的指针
- 使用关键字作为C函数形参或c++模板参数
- 在不调用initializer_list构造函数的情况下,将不可复制、不可移动的类型构造为函数形参
- 模板类复制构造函数形参,带或不带模板实参
- c++中函数形参中的右值引用