【发布时间】:2014-05-26 22:56:24
【问题描述】:
我是 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
}
}
这也有效。有区别吗?还是第二个只是捷径?同样在传递二维数组的情况下,我猜想下面的代码会起作用:
#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] 表示法或 (&a)[10][10] 表示法?
【问题讨论】:
-
void modify_array(int* a);采用指向整数块的指针或指向单个 int 的指针。可以堆栈或动态分配。modify_array(int (&a)[10])通过引用获取 10 个整数的数组。必须堆栈分配,大小不会丢失。可以使用 sizeof 运算符。 -
@CantChooseUsernames ok 那么
a[i]=i的使用是*(a+i)=i的快捷方式吗?在主程序的这两种情况下,我们都通过modify_array(&array[0])调用函数,因此我们将内存引用传递给数组的第一个元素,所以看起来a[i]=i将更改内存位置而不是实际值。谢谢。 -
@FredOverflow 谢谢我实际上没有看到这个(正在查看其他一些问题)。不确定它是否回答了我的所有问题,但我会看看。
标签: c++ arrays pass-by-reference pass-by-value