以下是代码
void printLoop(type?? p){
for(int i = 0; i<2;i++)
{
for(int e = 0;e<3;e++)
{
cout<<p[i][e]<<" ";
}
cout<<"\n";
}
}
void array()
{
int a[2][3] = {{1,2,3},{4,5,6}};
int (*p)[3] = a;
printLoop(p);
}
基本思想是我想在printLoop func中使用for循环打印出数组。但是,我需要知道具有2D数组地址的指针的类型。什么是指针的类型?是int (*)[]
吗?我很困惑。
“(*p)
”的含义是什么(来自int (*p)[3])
?非常感谢!
答案 0 :(得分:4)
“(* p)”是什么意思(来自int(* p)[3])?
p
是指向3
类型对象的int
大小数组的指针。
你的printLoop
函数有多个可能性(虽然一般的C限制,你最多可以留下一个 - 最外面的声明符为空):
您可以明确指定尺寸:
void printLoop(int p[ 2 ][ 3 ]);
这种方法的唯一优点是实现可以认为传递的数组具有所需的大小(即int
s的2x3矩阵)作为前提条件。
你可以完全忽略[2]部分:
void printLoop(int p[][ 3 ]);
,或者
void printLoop(int (*p)[ 3 ]);
int
您还需要传递尺寸(如果跳过一个尺寸),以确保您不会访问越界内存。所以,你的函数签名应该是这样的:
void printLoop(int (*p)[ 3 ], int dim);
答案 1 :(得分:3)
对于printLoop
函数,作为参数的int p[2][3]
应该可以正常工作。
int (*p)[3] = a;
p
是指向3 int
个数组的指针,初始化为指向a
。
答案 2 :(得分:2)
首先,您的代码不是非常现代的C ++。它基本上是“ c with iostreams ”。
其次,printLoop(int p[2][3])
是你正在寻找的签名,即使再次,它根本不是最好的做事方式。
第三,int (*p)[3]
分析如下:从p
的名称开始并环顾四周(首先是向右,然后向左,但这里没关系)直到你“击中”大括号。它只有一颗星,所以你可以说 p是一个指针。现在,您再次递归地执行相同的分析,您会看到[3]
,这意味着p
是指向具有3 int
s的数组的指针。
现在我想提及以下内容:
对静态大小的数组使用std::array
将std::vector
用于动态大小的数组。
哦,而且,我自己也不会使用2D数组,它们很笨重,只是一个语法糖(围绕基本的“数组”概念,也是一个语法糖)。
也许,这样的事情,大脑编译,希望是正确的,C ++ 11滥用:
std::array<int, 3 * 2> p = {{1, 2, 3, 4, 5, 6}};
std::for_each(std::begin(p), std::end(p), [](int elem){ std::cout<<elem; });
很好,花花公子。您也可以对某些“二维数组”大小进行lambda检查,并根据需要插入换行符。