为什么声明int* f[];没有给出错误或警告?

问题描述

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

int (*f())[];

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

我之所以这样问是因为,当我们将二维数组或指向整数数组的指针传递给函数时,总是应该在形式参数中声明指针时指定尺寸。
那么,为什么允许这个声明?

是否有任何特定的理由不对这种声明抛出错误或警告?
是在定义此函数时我们也可以省略尺寸吗?还是在定义尺寸时不可避免地要指定尺寸?
为了更好的理解,请也对此功能进行虚拟定义。

解决方法

将其扔到cdecl中,您将看到:

int (*f())[];

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

发生这种情况是由于array to pointer decay

,
int (*f())[];

很好

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

错误

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

很好

传递或返回数组时,必须给出除第一个数组以外的所有维。工作定义。

示例实现:

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

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

,

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

我们不需要指定要指向的数组的大小。不需要知道要在调用程序中指向的数组的确切大小。 dotnet run仅返回一个指针,而不是一个数组。

我之所以这样问是因为,当我们将二维数组或指向整数数组的指针传递给函数时,总是应该在声明形参中的形式参数时指定尺寸。

em>“

不,那不是事实。如果将指向数组的指针作为函数的参数传递,则声明该参数为指向f10元素的数组的指针,甚至不指向它都没关系一个数组,只声明一个指针。

50

完全有效。

int f (int *p) { return *p; } int a[7]; int b = f(a); 等于int* p,也等于int p[]

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

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

int