数组指针的类型

时间:2012-05-26 23:07:58

标签: c++ pointers

以下是代码

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])?非常感谢!

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::arraystd::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检查,并根据需要插入换行符。