2012-09-24 76 views
5

以下2個函數實質上是相同的函數嗎?int *參數與int []參數完全相同

即,int*int[]完全相同?

int myFunction(int* xVals, int* yVals, int nVertices); 
int myFunction(int xVals[], int yVals[], int nVertices); 

如何使用第一個功能?也就是說,我如何傳遞參數中的數組?以下有效/正確?

int xVals[5], yVals[5], zVals[5]; 
myFunction(xVals, yVals, zVals, 5); 

// or should it be.. 
myFunction(&xVals[0], &yVals[0], &zVals[0], 5); 
+4

你確定你不是指'int xVals []'嗎? – cnicutar

+0

@cnicutar是的sry它應該是 –

+0

沒問題,現在我可以推薦你[但我聽說char'a []'與char'* a']相同(http://c-faq.com/ aryptr/aryptr2.html) – cnicutar

回答

8

在一個函數的參數列表中,則該函數聲明是等效的:

int myFunction(int* xVals, int* yVals, int nVertices); 
int myFunction(int xVals[], int yVals[], int nVertices); 

然而,這不容易一概而論。在函數裏,有一個很大的區別:

int AnotherFunction(void) 
{ 
    int array[] = { 0, 1, 2, 3 }; 
    int *iptr = &array[0]; 
    ... 
} 

而且在功能接口,有兩個參數類型之間有很大的區別:

int arrays_vs_pointers(int **iptrptr, int array[][12]); 

你也問(修正):

int xVals[5], yVals[5]; 
myFunction(xVals, yVals, 5); 

// or should it be.. 
myFunction(&xVals[0], &yVals[0], 5); 

這些電話都是有效的,並等價於對方。


回答你原來的標題問題「是一個int *完全一樣的int []'是

它們的等價條件數量非常有限,但在許多情況下它們有很大不同。

您修改後的標題問題'的答案是int *參數與int []參數完全相同嗎?'是是的

2

標題中的問題是,在實際崗位體的問題不同...

一般,它是不是真的的指針是一樣的陣列,所以在很多情況下,int []int *不一樣。

然而,在函數聲明(或定義)中,當一維陣列被作爲參數傳遞,它衰變爲一個指針,這就是爲什麼,在與第一殼體相反,

int myFunction(int *xVals, int *yVals, int nVertices); 

int myFunction(int xVals[], int yVals[], int nVertices); 

是等價的。

1

以前的答案是正確的。這只是補充一點,你有你的聲明,您的電話之間的不匹配參數計數:

int myFunction(int* xVals, int* yVals, int nVertices); 

myFunction(xVals, yVals, zVals, 5); 

myFunction是預期的3個參數,但你傳遞4你的電話。

0

一些有趣的(?有用)圍繞所述的參數規格分:

  • ,如果你指定一個一維數組參數的維度,它不是在對調用者提供的參數任何方式檢查,例如:f(int x[5])可稱爲翼int x[] = { 1, 2}; f(x);甚至int x; f(&x);

  • ,如果你接受一個參數的引用,那麼尺寸檢查,必須匹配,例如:f(int (&x)[5])只能是調用這是一個整數陣列,精確至5的元件(或東西投射到該類型)的參數

  • 模板可用於捕獲的參數編譯器已知尺寸,如在:template <size_t N> void f(int (&x)[N]) { ...can use N in here... }

  • 這些最後兩個by-reference參數,你不能傳入任何舊的指針 - 如果指針真的是一個合適的數組,你必須首先對它進行類型轉換

  • 在編譯時檢查by-reference參數時間表明,當編譯時已經知道參數的數量時,應該首選它們......在實踐中可以是比這更復雜的smidge,例如提供聲明void f(int[]);的頭部的庫仍然可以改變實現並且發佈支持處理不同大小數組的新庫對象(其需要基於其他參數或哨兵(在大多數構建系統中)

相關問題