1

以下语句声明了一个不带参数并返回指向整数数组的指针的函数。

int (*f())[];

它返回一个指向_____大小的整数数组的指针
我们没有指定数组的大小,所以它应该给出某种警告或错误。

我问这个是因为当我们将二维数组或指向整数数组的指针传递给函数时,我们总是应该在正式参数中声明指针时指定维度。
那么,为什么允许这个声明呢?
是否有任何具体原因不为这种声明抛出错误或警告?
是我们在定义这个函数时也可以省略维度,还是在定义它时指定维度变得不可避免?
为了更好地理解,请给出这个函数的虚拟定义。

4

3 回答 3

2

将其放入cdecl中,您将看到:

int (*f())[];

将 f 声明为返回指向 int 数组的指针的函数

发生这种情况是因为数组到指针衰减

于 2020-08-27T15:44:47.757 回答
1
int (*f())[];

美好的

int (*f())[][];

错误

int (*f())[][8];

美好的

当您传递或返回一个数组时,您必须提供除第一个维度之外的所有维度。工作定义。

示例实现:

int (*f())[]
{
    static int array[8];
    static int *aptr = array;
    return &aptr;
}

您可能会为延迟初始化(包括延迟分配)做类似的事情,这是它自己的主题。

于 2020-08-27T15:45:02.387 回答
0

我们没有指定数组的大小,所以它应该给出某种警告或错误。

我们不需要指定要指向的数组的大小。不需要知道要在调用者中指向的数组的确切大小。f只返回一个指针,而不是一个数组。

我问这个是因为当我们将二维数组或指向整数数组的指针传递给函数时,我们总是应该在正式参数中声明指针时指定维度。

不,那不是真的。如果将指向数组的指针作为参数传递给函数,则将参数声明为指向1050元素数组的指针,甚至不指向数组并仅声明单个指针都没关系。

int f (int *p)
{
    return *p;
}

int a[7];
int b = f(a);

是完全有效的。

int* p等于int p[]也等于int p[239]

传递的指针被视为单指针。

如果在调用者中传递指向 2D 数组的指针(或更具体地说是指向 数组的指针int),可以省略第一个维度,但需要指定最后一个维度。

int f (int (*p)[5])
{
    return **p;
}

int a[4][5];
int b = f(a);
于 2020-08-27T16:06:41.513 回答