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

还有“”是什么(*p)意思(来自int (*p)[3])?非常感谢!

4

3 回答 3

4

"(*p)" 是什么意思(来自 int (*p)[3]) ?

p3是指向类型为对象大小的数组的指针int

您的printLoop函数有多种可能性(尽管具有一般 C 限制,您最多可以保留一个 - 最外面的声明符为空):

  • 您可以明确指定尺寸:

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

这种方法的唯一优点是实现可以考虑将传递的数组具有所需的大小(即ints 的 2x3 矩阵)作为先决条件。

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

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

或者,

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

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

void printLoop(int (*p)[ 3 ], int dim);
于 2012-05-26T23:17:05.557 回答
3

对于printLoop函数,int p[2][3]作为参数应该可以工作。

int (*p)[3] = a;

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

于 2012-05-26T23:12:10.257 回答
2

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

其次,printLoop(int p[2][3])是您要寻找的签名,尽管这又不是最好的做事方式。

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

现在我想提以下几点:

用于std::array静态大小的数组。
用于std::vector动态大小的数组。

哦,另外,我自己不会使用二维数组,它们很笨重,只是一个语法糖(围绕基本的“数组”概念,它也是一个语法糖)。

所以也许,像这样,大脑编译,希望是正确的,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 检查并插入换行符。

于 2012-05-26T23:19:03.527 回答