数组指针的类型

Type of pointer of array

本文关键字:类型 指针 数组      更新时间:2023-10-16

下面是代码

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

另外"(*p)"是什么意思(来自int (*p)[3])?多谢!

"(*p)

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

p 是指向大小为 int 3 类型的对象的数组的指针。

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

  • 您可以显式指定维度:

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

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

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

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

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

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

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

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

int (*p)[3] = a;

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

首先

,你的代码不是很现代C++。它基本上是"带有iostreams的c"。

其次,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 检查一些"2D 数组"大小,并根据需要插入换行符。