问题描述
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>“
不,那不是事实。如果将指向数组的指针作为函数的参数传递,则声明该参数为指向f
或10
元素的数组的指针,甚至不指向它都没关系一个数组,只声明一个指针。
50
完全有效。
int f (int *p)
{
return *p;
}
int a[7];
int b = f(a);
等于int* p
,也等于int p[]
。
传递的指针被视为单个指针。
如果在调用方中传递指向2D数组的指针(或更具体地说,指向int p[239]
数组的指针),则可以省略第一个数组,但需要指定最后一个维度。
int