函数声明中带有[]运算符的指针——它是什么意思
Pointer with [ ] operator in function declaration - what does it mean?
这个函数的参数是什么意思?有人能举一个如何调用这个函数的例子吗?
template<int N, int K> void poly_multiply(int (*p1)[N], int (*p2)[K], int (*p3)[N+K-1]){
}
int (*p1)[N]
p1
是指向N个int数组的指针。与正常的"阵列"参数不同,例如:
void foo(int arr[], int arr2[10])
保留了数组的类型(包括大小)。它不会降级为指向int的指针。您还可以引用数组:
int (&r1)[N]
int (&r2)[N+K-1]
int (*p)[N]
形式的声明意味着p
是指向N个int数组的指针阅读这样的声明是很棘手的——你从标识符开始,然后转到右边,当没有其他内容时跳到左边,同时遵守括号引入的优先级。谷歌"螺旋规则"获取更多信息。以下是阅读声明的另一种方式(James Kanze的回答)。
一个例子:
template<int N, int K>
void poly_multiply(int (*p1)[N], int (*p2)[K], int (*p3)[N+K-1])
{
}
int a[5]; // N = 5
int b[10]; // K = 10
int c[14]; // 10+5-1 = 14
poly_multiply(&a, &b, &c);
因为poly_multiply
是一个函数模板,它允许您传递任何大小的数组的指针,只要第三个数组的大小加起来为N+K-1,否则编译器就会给您一个错误。大小N和K将自动推导出来(除非您选择显式指定模板参数)。
请注意,您需要获取数组的地址,并且不能像poly_multiply(a,b,c);
那样调用函数,因为在这种情况下,数组将衰减为指向第一个元素(int*
)的指针,并且函数将不匹配。
template<int N, int K>
void poly_multiply(int (*p1)[N], int (*p2)[K], int (*p3)[N+K-1]);
有三个参数:
指向
N
int
的阵列的指针指向
K
int
的阵列的指针指向
N+K-1
int
s 阵列的指针
请注意,后者是非推导上下文。这意味着N
和K
都不会被推导为调用的最后一个参数,因此专门化的最后一次参数的类型仅取决于调用的前两个参数的类型。
示例:
int arr1[2];
int arr2[3];
int arr3[4];
poly_multiply(&arr1, &arr2, &arr3);
poly_multiply(&arr1, &arr2, &arr2); // Error! Pointer to int[3] cannot be
// converted to pointer to int[4]
相关文章:
- 通过引用函数传递指针参数是什么意思?
- 使用大括号实例化 - 它是什么,为什么在这里使用它?
- 当我打印字符串时,我不知道它是什么输出
- 它是什么SOMTEMPLATE_VR_API
- wxDataViewModel:它是什么以及如何使用它
- typedef void (*MyCallback) : 它是什么以及如何使用它
- C ++技巧与*和它是什么意思
- 拥有功能指针类型是什么意思
- 它是什么?C++宏函数?如何替换这个宏?我能举个例子吗
- 由向量中的负索引引起的杂散 '342' 或它是什么
- 我在运行时遇到以下错误.它是什么意思?我该如何调试它
- 这个指针类型是什么以及如何使用它
- 视觉错误类 c++ 类。 不知道它是什么
- 为什么地址运算符是C++类的默认成员,它是什么
- 我不认为这是选角,但它是什么?
- 函数声明中带有[]运算符的指针——它是什么意思
- 如果类实现多个接口,VTable 的方法指针顺序是什么?
- 初始化函数内部的指针.它是如何工作的
- 警告C4309 -它是什么意思,在这种情况下可以忽略它
- CL错误与MS Visual Studio 2010,它是什么