在c ++中通过引用传递1d和2d数组

时间:2014-04-12 19:56:57

标签: c++ arrays pass-by-reference pass-by-value

我是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]符号?

1 个答案:

答案 0 :(得分:3)

撰写*(a+i)=i;a[i]=i;是等效的。第一个被视为应用于指向数组的指针的偏移量,并将值赋给指针对象,而第二个则将值赋给数组的元素。

但是,当将指针传递给函数modify_array(int* a)时,它无法推断出指针对象是一个二维数组,并且不知道要偏移的大小是为了解决数组的其他行,{{1 }}。对于编译器,它只能访问数组的第一个维度。

正确的方法来做你需要的是这个

a[i][j]=i*j;

Live example

该函数期望一个10x10的int数组,通过引用传递。