[英]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];
}
這並沒有改變關於如何從內部看到A
和B
的規則,而是向調用者方提供了預期有多少數組元素的信息。 目前,gcc接受這種新語法,並忽略了這些信息。
它沒有什么可以通過的! []約束允許編譯器執行更多檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.