函数声明中带有[]运算符的指针——它是什么意思

Pointer with [ ] operator in function declaration - what does it mean?

本文关键字:指针 它是什么 意思 运算符 声明 函数      更新时间:2023-10-16

这个函数的参数是什么意思?有人能举一个如何调用这个函数的例子吗?

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-1ints 阵列的指针

请注意,后者是非推导上下文。这意味着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]