簡體   English   中英

為什么聲明 int (*f())[]; 不給出錯誤或警告?

[英]Why does the declaration int (*f())[]; doesn't give an error or warning?

以下語句聲明了一個不帶參數並返回指向整數數組的指針的函數。

int (*f())[];

它返回一個指向大小為_____的整數數組的指針
我們沒有指定數組的大小,所以它應該給出某種警告或錯誤。

我問這個是因為當我們將二維數組或指向整數數組的指針傳遞給函數時,我們總是應該在聲明形式參數中的指針時指定維度。
那么,為什么允許這個聲明呢?
是否有任何特定原因不為此類聲明拋出錯誤或警告?
是不是我們在定義這個函數時也可以省略維度,或者在定義它時指定維度變得不可避免?
為了更好地理解,請同時給出這個函數的虛擬定義。

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

 int (*f())[];

將 f 聲明為函數,返回指向 int 數組的指針

這是因為數組到指針衰減

int (*f())[];

美好的

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

錯誤

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

美好的

當你傳遞或返回一個數組時,你必須給出除第一個維度以外的所有維度。 工作定義。

示例實現:

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

您可能會為延遲初始化(包括延遲分配)執行類似的操作,這是它自己的主題。

我們沒有指定數組的大小,所以它應該給出某種警告或錯誤。

我們不需要指定要指向的數組的大小。 不需要知道要在調用者中指向的數組的確切大小。 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM