簡體   English   中英

函數原型中的參數

[英]Arguments in a function prototype

我的問題是:當我在C中編寫函數原型時,如下所示:

void foo(int *vector);

這是一回事:

void foo(int vector[MAX_LENGTH]);

到函數,總是作​​為指針傳遞? 代碼是一樣的嗎? 提前致謝。

這很微妙。 C中的數組不是指針,但C不允許將數組作為函數參數傳遞。 所以當你有void foo(int vector[MAX_LENGTH]); ,基本上你所做的就是告訴其他程序員(以及你未來的自己),這個函數需要傳遞一個MAX_LENGTH數組。 編譯器不會幫助你。 它將以靜默方式將數組轉換為指針。

很好地解釋了它。

是的,數組類型在傳遞給函數時會隱式轉換為指針類型。

所以

void foo(int *a)void foo(int a[])是相同的。

您可以在函數定義中使用sizeof()運算符輕松檢查它

例如

void foo(int a[])
{
   std::cout<<sizeof(a); //prints sizeof(int*)
}

int main()
{

   int a[]={1,2,3,4};
   foo(a);
}

EXTRA (打印函數內數組的大小)

[C++ Only]

 template<typename T,size_t n>
 void size_of_array(T (&a)[n]) //Array passed by reference. Template argument deduction 
 {
    std::cout<<sizeof(a); //prints sizeof(n*sizeof(int))
 }

 int main()
 {
      int a[]={1,2,3,4,5};
      size_of_array(a);
 }

這是C語言的粗略邊緣之一。 兩個看起來完全相同的聲明(但對於名稱),一個在原型中,一個作為堆棧變量,導致聲明兩種不同類型的變量。

void foo(int A[10]) {
   int B[10];    
}

foo的范圍內, A指向int的指針B十個int類型的元素的數組 正如其他人提到的那樣,即使用sizeof計算的尺寸也不同。

C ++繼承了規則,因此對於您的示例代碼,兩個函數的原型應該是相同的。

通過引入新的關鍵字static C99進一步使這個問題復雜化;-)

void foo(int A[static 10]) {
   int B[10];    
}

這並沒有改變關於如何從內部看到AB的規則,而是向調用者方提供了預期有多少數組元素的信息。 目前,gcc接受這種新語法,並忽略了這些信息。

它沒有什么可以通過的! []約束允許編譯器執行更多檢查。

暫無
暫無

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

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