例如,你能解释下面的代码会发生什么吗?
class Vector{
int v[3];
Vector(int *x);//parameterized constructor created
};
Vector::Vector(int *x)//definition of the parameterized constructor
{
for (int i=0;i<size;i++)
v[i]=x[i];//what happens here?? why did we take pointer as arguement?
}
根据我的理解,通过v[i]=x[i]
我们创建了一个新数组,其中v
的所有元素现在都在x
中。为什么这需要一个指针参数?不能用引用&
完成吗?
答案 0 :(得分:2)
这可以追溯到旧式C习惯,当你可以将指针用作数组时,通过“索引”它的元素。
取自:https://en.wikibooks.org/wiki/C_Programming/Pointers_and_arrays
然而,有几点说明:
v[i]=x[i]
我们创建了一个新数组
不,你没有在这里创建一个新数组,当构造函数的主体被执行时,数组已经被创建了。这里发生的是,对于值v[i]
,我们将赋值:*(x + i)
即。 i
。x
。地址x
指向的元素。除非您知道如何创建和初始化int
,否则这是非常危险的代码。想象一下,您可以使用单个size
的地址来调用此方法。我想,{{1}}是3或更少,否则此代码存在严重的安全问题。
在尝试访问它们指向的值之前,您应始终检查空指针。
答案 1 :(得分:1)
如果在编译时知道x
的大小,可以通过引用传入数组:
Vector(int (&x)[3]);
如果您在编译时不知道大小,那么您所做的就是从不安全的代码到明显错误的代码。
如果您在编译时知道大小,则使用std::array
,如果不知道,则使用std::vector
。
答案 2 :(得分:0)
为了向先前的答案添加一点,索引操作符[]
实际上取消引用指针并同时将其转换为索引* sizeof(类型)。这同样涉及数组的声明。比如说,如果你声明int a[1];
,这意味着a
现在是指向int的指针,即int*
。因此,如果您想将其作为参数传递给函数,则需要将其类型指定为int*
。