数组指针的类型
Type of pointer of array
下面是代码
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 数组"大小,并根据需要插入换行符。
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 如何访问在 c++ 中在类内声明的结构类型指针变量?
- (C )找到基本类型指针的儿童类型
- 表达式必须具有指向对象的指针类型(指针向量)
- 将子项复制构造到父类型指针中
- C 返回类型指针声明
- 调用虚拟函数而不通过类类型指针创建任何对象
- C++ 如何使用类类型指针制作向量
- 为什么基类型指针不能获取派生类对象的地址值?
- 如何在 C++ 中获取映射类型指针,映射
- 如何检查该类型的类型指针是正确对齐的
- 正在转换为短类型指针
- 指向任意类方法的模板非类型指针
- 如何通过强制转换类型指针将字符数组转换为uint16_t
- 指向shared_ptr的不透明类型 C 指针
- C++:从值类型指针强制转换为包含迭代器
- C/C++:访问给定类型指针的位置与访问另一类型指针的相同位置不同
- 比较类型指针
- 数据类型指针使用*(Datatype *)
- 如何打印c++中char类型指针的所有值