C++ 这个std::string指针如何变成数组?
您好,我在这里遇到了关于从函数返回数组的教程中的代码问题C++ 这个std::string指针如何变成数组?,c++,arrays,function,pointers,stdstring,C++,Arrays,Function,Pointers,Stdstring,您好,我在这里遇到了关于从函数返回数组的教程中的代码问题 std::string(&func(std::string(&arr)[10]))[10] { return arr; } int main() { std::string array[10] = { "efwefwef","wefffj","mfls","hrkr","sgte","ege&quo
std::string(&func(std::string(&arr)[10]))[10]
{
return arr;
}
int main()
{
std::string array[10] = { "efwefwef","wefffj","mfls","hrkr","sgte","ege","ky","retg","sujtre","fl;yiu" };
std::string* array23 = func(array);
std::cout << array23[0] << std::endl; // why does this work
std::cout << array23[1] << std::endl; // why does this work
}
,并且可以使用操作符[]
(即指针[index])访问指针对象
函数
func
返回对std::string
s(c样式)数组的引用,其中包含10个元素
如果使用别名清楚地编写函数,它将如下所示:
// alias type: the returned type!
using Type = std::string(&)[10];
Type func(std::string (&arr)[10])
{
return arr;
}
std::string(&)[10]
数组元素可以通过operator[]
像普通的c样式数组一样访问。所以问题是为什么您显示的代码有效(即std::string*array23
)
这是因为上述原因。就
std::string* array23 = func(array);
返回的(c样式)数组(即从func(array);
)衰减为指向数组第一个元素的指针
意义
array23[0]
相当于
*(array23 + 0)
因此它起作用了!这同样适用于array23[1]
(即等同于*(array23+1)
)
如果在那里编写实际类型,则需要
std::string (&array23)[10] = func(array);
// or
// Type array23 = func(array);
在没有运算符重载的情况下,a[b]
相当于*(a+b)
。另外,我不确定func的用途,您可以编写std::string*array32=array代码>直接。如果一个教程使用像std::string(&func(std::string(&arr)[10]))[10]
这样复杂的声明,除了教你如何阅读它们之外,它可能不是最好的教程;这份声明太复杂了,几乎任何人都读不懂。使用typedef
为中间类型创建名称并使用这些名称。“func返回对数组的引用…这意味着…std::string*array23
…相当于…std::string(&array23)[10]
…因此…操作符[]
…工作起来”我觉得这非常误导。两者并不等同。而[]
工作与func
返回引用无关。@HolyBlackCat是,在写下答案后实现。根据更新了答案。谢谢你指出。现在应该清楚了。
std::string (&array23)[10] = func(array);
// or
// Type array23 = func(array);