这个 std::string 指针如何变成数组?
How this std::string pointer turns into array?
您好,我在使用有关从函数返回数组的教程中的这段代码时遇到问题
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
}
它编译得很好,但我对如何将 std::string* array23
与索引运算符一起使用感到困惑。
我最初认为这是因为 std::string
是一个字符数组,您可以使用索引运算符单独访问它们,但接下来的代码有效,我不明白为什么。
::std::uintptr_t x = 2453;
::std::uintptr_t* pX = &x;
std::cout << "Var: " << pX[0]; // pX prints 2453
The plane arrays(c-style) can be decayed to a pointer to the type of the array,可以使用operator[]
(即pointer[index])访问pointee。
函数 func
returns 对包含 10
个元素的 std::string
的 (c-style) 数组的引用。
如果你用别名把函数写清楚的话,它会是这样的:
// alias type: the returned type!
using Type = std::string(&)[10];
Type func(std::string (&arr)[10])
{
return arr;
}
std::string(&)[10]
数组元素可以像普通 c-style 数组一样通过 operator[]
访问。所以问题是为什么您显示的代码有效(即 std::string* array23
)?
这是因为上面提到的原因。在
的情况下
std::string* array23 = func(array);
返回的 (c-style) 数组(即来自 func(array);
)衰减到指向数组第一个元素的指针。
含义
array23[0]
等同于
*(array23 + 0)
因此有效!这同样适用于 array23[1]
(即等于 *(array23 + 1)
)。
如果您在此处写入实际类型,则需要
std::string (&array23)[10] = func(array);
// or
// Type array23 = func(array);
您好,我在使用有关从函数返回数组的教程中的这段代码时遇到问题
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
}
它编译得很好,但我对如何将 std::string* array23
与索引运算符一起使用感到困惑。
我最初认为这是因为 std::string
是一个字符数组,您可以使用索引运算符单独访问它们,但接下来的代码有效,我不明白为什么。
::std::uintptr_t x = 2453;
::std::uintptr_t* pX = &x;
std::cout << "Var: " << pX[0]; // pX prints 2453
The plane arrays(c-style) can be decayed to a pointer to the type of the array,可以使用operator[]
(即pointer[index])访问pointee。
函数 func
returns 对包含 10
个元素的 std::string
的 (c-style) 数组的引用。
如果你用别名把函数写清楚的话,它会是这样的:
// alias type: the returned type!
using Type = std::string(&)[10];
Type func(std::string (&arr)[10])
{
return arr;
}
std::string(&)[10]
数组元素可以像普通 c-style 数组一样通过 operator[]
访问。所以问题是为什么您显示的代码有效(即 std::string* array23
)?
这是因为上面提到的原因。在
的情况下std::string* array23 = func(array);
返回的 (c-style) 数组(即来自 func(array);
)衰减到指向数组第一个元素的指针。
含义
array23[0]
等同于
*(array23 + 0)
因此有效!这同样适用于 array23[1]
(即等于 *(array23 + 1)
)。
如果您在此处写入实际类型,则需要
std::string (&array23)[10] = func(array);
// or
// Type array23 = func(array);