2012-05-26 47 views
1

的指针下面是代码类型数组

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循环打印出数组。但是,我需要知道具有二维数组地址的那个指针的类型。指针的类型是什么?是int (*)[]?我很困惑。

而且什么是 “(*p)” 的意思是(从int (*p)[3])?多谢!

+0

这是一个很好的阅读:http://c-faq.com/decl/spiral.anderson.html。由此看来,逆时针工作,你可以看到'p'是一个'''''''''''''''''''int'的'*'指针。 – chris

回答

4

什么“(* p)”的意思是(从int(* p)[3])?

p是指向int类型的对象的大小3的阵列。

你必须为你的printLoop功能多possibilites(虽然与一般的C-限制,你可以在最多一个离开 - 最外面的声明符空):

  • 您可以明确指定尺寸:

    void printLoop(int p[ 2 ][ 3 ]);

用这种方法唯一的优势就是实现can认为要传递的数组具有所需的大小(即, 2x3矩阵的int s)作为前提条件。

  • 可以省略完全在[2]部分:

    void printLoop(int p[][ 3 ]);

,或者

void printLoop(int (*p)[ 3 ]); 
  • 可以使用一个指针的指针int

您还需要传递维度(如果跳过的话),以确保您不会访问超出界限的内存。所以,你的函数签名应该是这样的:

void printLoop(int (*p)[ 3 ], int dim); 
+0

无论您是否定义,第一个维度都会丢失。指针衰减的数组也在函数参数中起作用。 –

+0

@ K-ballo:是的。但是签名可以作为一种*文档*供执行者自由采用。 – dirkgently

+0

非常感谢。现在我对发生的事情有了更好的理解! – whileone

3

对于printLoop功能,int p[2][3]作为参数应该只是工作。

int (*p)[3] = a; 

p是一个指针数组3 int s,初始化为指向a

2

首先,你的代码不是很现代的C++。它基本上是“c与iostreams”。

其次,printLoop(int p[2][3])是您正在寻找的签名,即使再次,它不是最好的做法。

第三,int (*p)[3]分析如下:以p的名字开头,然后环顾一下(先向右边,然后向左走,但这里没关系),直到你“打”大括号。它只有一颗星星,所以你可以说p是一个指针。现在,您再次递归地执行相同的分析,您会看到[3],这意味着p是指向具有3 int s的数组的指针。

现在我想提以下几点:

使用std::array为staticly大小的数组。
对于动态大小的数组使用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检查一些“2d数组”的大小并插入换行符。