我是c ++的新手,并且有一些关于通过引用函数传递数组的问题(以便通过函数修改数组)。我意识到已经提出了类似的问题,但我认为有些问题在以前的问题中没有涉及(至少从我看到的问题)。根据我目前收集的内容,可以通过以下方式通过引用传递数组:
#include<iostream>
using namespace std;
void modify_array(int* a);
int main()
{
int array[10];
modify_array(&array[0]);
for(int i=0;i<10;i++)
{
cout<<array[i]<<endl;
}
}
void modify_array(int* a)
{
int i;
for(i=0;i<10;i++)
{
*(a+i)=i;
}
}
这对我有意义,但如果我将功能更改为:
void modify_array(int* a)
{
int i;
for(i=0;i<10;i++)
{
a[i]=i; //line changed
}
}
这也有效。有区别吗?或者第二只是捷径?同样在传递2d数组的情况下,我猜想下面的代码可以工作:
#include<iostream>
using namespace std;
void modify_array(int* a);
int main()
{
int array[10][10];
modify_array(&array[0][0]);
}
void modify_array(int* a)
{
int i,j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
a[i][j]=i*j;
}
}
}
但这并不是。根据我在其他相关问题中看到的内容,您可以执行以下操作:
void modify_array(int (*a)[10])
{
int i,j;
//a[i][j]= blah blah blah;
}
,或者
void modify_array(int (&a)[10][10])
{
int i,j;
//a[i][j]= blah blah blah;
}
后两个函数定义有什么区别?有经验的c ++程序员推荐使用什么:(* a)[10] [10]符号或(&amp; a)[10] [10]符号?
答案 0 :(得分:3)
撰写*(a+i)=i;
或a[i]=i;
是等效的。第一个被视为应用于指向数组的指针的偏移量,并将值赋给指针对象,而第二个则将值赋给数组的元素。
但是,当将指针传递给函数modify_array(int* a)
时,它无法推断出指针对象是一个二维数组,并且不知道要偏移的大小是为了解决数组的其他行,{{1 }}。对于编译器,它只能访问数组的第一个维度。
正确的方法来做你需要的是这个
a[i][j]=i*j;
该函数期望一个10x10的int数组,通过引用传递。