指向数组的指针声明为Type (*p)[N];
。例如,
int a[5] = { 1, 2, 3, 4, 5 };
int(*ptr_a)[5] = &a;
for (int i = 0; i < 5; ++i){
cout << (*ptr_a)[i] << endl;
}
会在a
中输出五个整数。
如何从new int[5]
转换为int (*p)[5]
类型。
例如,当我编写一个返回指向新数组的指针的函数时,以下代码无法编译。
int (*f(int x))[5] {
int *a = new int[5];
return a; // Error: return value type does not match the function type.
}
它产生:
error: cannot convert ‘int*’ to ‘int (*)[5]’
答案 0 :(得分:5)
您可以使用:
int (*a)[5] = new int[1][5];
示例:
#include <iostream>
int main()
{
int (*a)[5] = new int[1][5];
for ( int i = 0; i < 5; ++i )
{
(*a)[i] = 10*i;
std::cout << (*a)[i] << std::endl;
}
delete [] a;
}
输出:
0 10 20 30 40
答案 1 :(得分:4)
您可以使用typedef
清理代码,然后更容易看到如何使其运行:
#include <iostream>
typedef int (*P_array_of_5_ints)[5];
P_array_of_5_ints f() {
int *a = new int[5];
*a = 42;
return (P_array_of_5_ints)a;
}
int main()
{
P_array_of_5_ints p = f();
std::cout << (*p)[0] << '\n';
}
(见运行here at ideone.com)
答案 2 :(得分:1)
你有这个标记的C ++所以请不要这样做。请改用vector
。它清除了整个语法和,确保你不会泄漏内存!
std::vector<int> f(int x)
{
std::vector<int> a(5);
return a;
}
答案 3 :(得分:1)
#include <iostream>
using namespace std;
int (*f(int x))[5]
{
int (*a)[5] = new int[1][5];
return a; // Error: return value type does not match the function type.
}
int main(void)
{
int a[5] = { 5, 4, 3, 2, 1 };
int(*ptr_a)[5] = &a;
for (int i = 0; i < 5; ++i)
{
cout << (*ptr_a)[i] << endl;
cout << f(i) << endl;
}
}
答案 4 :(得分:1)
C ++ 11有更好的方法来处理固定大小的数组。我建议使用std :: array而不是c-style数组。现代编译器应该发出与指针版本相同的高效代码。
std::array<int,5> f()
{
std::array<int,5> a;
return a;
}
如果你真的想弄乱指针,请使用以下内容。
std::array<int,5>* f()
{
std::array<int,5>* a = new std::array<int,5>;
return a;
}
我还建议不要使用原始指针而是使用智能指针(例如std :: unique_ptr),以防止因忘记删除数组而导致内存泄漏。
typedef std::array<int,5> array_of_5_ints;
std::unique_ptr<array_of_5_ints> f()
{
std::unique_ptr<array_of_5_ints> a = new std::array<int,5>;
return a;
}
答案 5 :(得分:-2)
将您的功能更改为
int (*f())[5] {
int *a = new int[5];
//code ...
return (int (*)[5])a;
}