int* test_prt(const vector<int>* array, const int index)
{
return array+index;
}
为什么第一个参数不能是const?在这种情况下,“const”意味着什么不能修改?
通常放在const
类型名称之后,因为它启用了“向左规则”。
这和你写的一样:
int* test_prt(vector<int> const* array, const int index)
{
return array+index;
}
这里,左边的项目是向量,所以这是一个指向常量向量的指针。
如果你不使用这个约定,唯一的特殊情况是 whenconst
一直在左边(const 左边没有任何东西),这意味着它适用于 . 右边的东西const
。
array + index
没有修改array
or index
,它只是计算两个操作数之间的和而不影响原始操作数,因此代码按预期工作。这里的const
意思是向量和index
不能以任何方式改变。例如,如果我尝试更改array
s 元素之一,则会收到错误消息:
array[0] = 5; // error! assignment of read-only value
这同样适用于index
。顺便说一句,我认为你的函数签名应该写成:
int* test_prt(const vector<int>& array, const int index)
{
return &array[index];
// or &array.at(index) which performs bounds checking
}
也就是说,我们通过引用获取向量,并使用其内部缓冲区指向的第一个元素的偏移量。通过引用获取是必不可少的,因为它避免了复制并返回指向本地副本的指针将是未定义的行为。您的原始代码只有在array
是一个实际的向量数组时才有效!
为了清楚起见,以下是调用函数的方式:
std::vector<int> v = {1, 2, 3, 4, 5};
std::cout << test_ptr(v, 1); // prints the address of the 2nd element
我还将删除整数前面的“const”。因为它是一个按值传递的参数,
int* test_prt(vector<int> const* array, int index)
{
return array+index;
}