函数声明中带[]运算符的指针 - 这是什么意思?

时间:2014-11-01 20:42:23

标签: c++ templates

此功能的参数是什么意思?有人可以举例说明如何调用这个函数吗?

template<int N, int K> void poly_multiply(int (*p1)[N], int (*p2)[K], int (*p3)[N+K-1]){

}

3 个答案:

答案 0 :(得分:4)

int (*p1)[N]

p1是指向N个int数组的指针。与普通&#34;阵列不同#34;参数,例如:

void foo(int arr[], int arr2[10])

保留数组的类型(包括大小)。它不会降级为指向int的指针。您还可以引用数组:

int (&r1)[N]
int (&r2)[N+K-1]

答案 1 :(得分:2)

int (*p)[N]形式的声明意味着 p是一个指向N个int数组的指针。读取这些声明很棘手 - 你先从标识符开始然后去在没有更多的情况下向右跳并向左跳,同时遵守括号引入的优先顺序。谷歌“螺旋规则”获取更多信息。 Here's另一种阅读宣言的方式(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*)和功能不会匹配。

答案 2 :(得分:1)

template<int N, int K>
void poly_multiply(int (*p1)[N], int (*p2)[K], int (*p3)[N+K-1]);

有三个参数:

  • 指向N int s

  • 数组的指针
  • 指向K int s

  • 数组的指针
  • 指向N+K-1 int s

  • 数组的指针

请注意,后者是非推断的上下文。这意味着,对于调用的最后一个参数,NK都不会被推导出来 - 因此,特化的最后一个参数的类型仅取决于调用的前两个参数的类型。

示例:

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]