簡體   English   中英

當 function 原型具有聲明為 int a[][10] 的參數時,編譯器將其視為 int (*a)[10] 是否真的如此?

[英]Is it actually true that when function prototype has a parameter declared as int a[][10] the compiler treats it as int (*a)[10]?

我聽很多人說,當我們想將一維數組傳遞給 function fun時,以下原型是等效的:

1.

   int fun(int a[]);
   int fun(int a[10]);
   int fun(int *a);

我什至聽人說C中的第一個和第二個內部轉換為第三個。 我猜這是真的,因為在 2 中聲明的 function 的定義中執行sizeof(a)會給出以字節為單位的指針大小(而不是 10*sizeof(int))。

話雖如此,我已經看到聲稱將二維數組傳遞給 function 的文本是等效的:

1.

int fun(int a[][10]);
int fun(int (*a)[10]);

在這里,我再次聽到人們說在 C 中,第一個在內部轉換為第二個。 如果這是真的,以下應該是等價的吧?

1.

int fun(int a[][]);
int fun(int (*a)[]);

但不幸的是,第一個提出了編譯錯誤,但第二個沒有:

    1 | int fun(int a[][]);
      |             ^
t.c:2:13: note: declaration of ‘a’ as multidimensional array must have bounds for all dimensions except the first

這讓我覺得 C 首先將a視為一個多維數組,其中每個元素都是一個 integer 數組,但它們的類型不完整(即 int[] )。

而在第二個中, a只是一個指向整數數組的指針(未指定大小或類型不完整)。 而且兩者確實不同,一種格式不等於另一種格式...

任何人都可以詳細指導我在每種情況下 C 中實際發生的情況嗎?

首先,聲明的規則說數組的元素類型必須是完整的,根據 C 2018 6.7.6.2 1. 所以int a[][]得到一個編譯器錯誤,因為第一個[]指定了一個元素為int []的數組int [] ,這是不完整的。

解析聲明,根據C 2018 6.7.6.3 7,將function參數聲明為數組調整為指針。

允許int (*a)[]沒有錯誤,因為沒有規定指針必須指向完整類型。 (如果對指針執行算術,則指向的類型必須是完整的,根據 C 2018 6.5.6 2 和 3。)

相關規則見 C17 6.7.6.3/7:

將參數聲明為 ''array of type '' 應調整為 ''qualified pointer to type '',其中類型限定符(如果有)是在數組類型派生的 [ 和 ] 中指定的那些

這有時被非正式地稱為“數組衰減”,類似於在表達式中使用數組標識符的規則。


我什至聽人說C中的第一個和第二個內部轉換為第三個

是的,這是正確的,根據上面引用的規則。 第一個示例中的所有 3 個聲明都是 100% 等效的。


話雖如此,我已經看到聲稱將二維數組傳遞給 function 的文本是等效的:/--/
在這里,我再次聽到人們說在 C 中,第一個在內部轉換為第二個。

正確的。


int fun(int a[][]); 是一個無效的聲明,因為這實際上是一個不完整數組類型的數組,其中每個數組的所有項都是int的不完整類型。 C 不允許使用不完整類型的元素聲明 arrays。

C17 6.7.6.2/1

元素類型不得為不完整或 function 類型。

然而,我們可以將最外層的維度保留為不完整的數組類型,因為它無論如何都會被調整為指針,從而使其大小無關緊要。 但是根據上述規則,對於內部尺寸不能做到這一點,即 arrays 的元素必須是完整的類型。 (我們也不能有不完整結構類型的 arrays。)

int (*a)[]是有效的,因為它是一個指向不完整類型數組的指針。 同樣,C 允許我們使用指向不完整結構類型的指針,但我們不能聲明不完整結構類型的對象。

暫無
暫無

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

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