2013-06-12 44 views
4

我有關於傳遞數組的第一元素的地址到(遞歸)功能的問題:子陣列通過地址給一個函數

selectionSort(&b[1], size-1); 

當地址被傳遞給函數,函數參數必須是我知道指針。 selectionSort方法獲取int b[]作爲參數。不是指針。

但代碼工作沒有任何問題。此代碼也生成子數組。當我們傳遞第一個元素時,它會變成子陣列的zeroeth元素嗎?

void selectionSort(int b[], int size) 
{ 
    int temp,i; 

    if (size>=1) 
    { 
     for (i = 0; i < size; i++) 
     { 
      if (b[i]<b[0]) 
      { 
       temp=b[0]; 
       b[0]=b[i]; 
       b[i]=temp; 
      } 
     } 
     selectionSort(&b[1], size-1); 
    } 
} 
+0

「它變成了子陣列零元素?」 - ***什麼?*** – 2013-06-12 12:33:06

+1

此外,[數組不是指針](http://c-faq.com/aryptr/aryptr2.html),但他們可以[衰變成一個。](http:// stackoverflow.com/questions/1461432/what-is-array-decaying)。 – 2013-06-12 12:34:50

+0

對不起,我的英文。我試圖說,當原始數組的第一個元素地址發送到函數時,此元素變成子數組的第0個元素?這是瘋狂的 – Lyrk

回答

4

只要你有一個功能,如:

void f(int b[]); 

這是一樣的

void f(int *b); 

[]語法功能參數僅僅是一個特殊的語法,讓讀者知道您打算使用參數就像一個數組,但它實際上只是一個指針。你不能將一個實際的數組傳遞給一個函數。指針和數組在C中的工作方式非常相似,因此大多數情況下,您可以像使用數組一樣使用指針(但要小心 - 有一些重要的例外)。

例如,當你訪問一個數組的元素是這樣的:

array[index] 

這是一樣的

*(array+index) 

並不要緊array是否是真正的陣列或只是一個指針。

所以&b[1]&*(b+1)相同,與b+1相同。

如果我們讓我們看到了b參數爲指針寫的代碼,它應該是這樣的:

void selectionSort(int *b, int size){ 
    . 
    . 
    . 

    selectionSort(b+1, size-1); 

    . 
    . 
    . 
} 

現在,你可以看到selectionSort被傳遞的指針爲int ,並用一個指向下一個int的指針調用自己。

+0

第一個函數會理解它的一個指針嗎? –

+0

@Gorfi'foo(int arr [])'相當於'foo(int * arr)'。正如指出的那樣,作爲參數傳遞給函數的數組衰減爲指針。 – Nobilis

+0

你確定他不會在第一次運行後失去陣列嗎? –

2

是,該代碼將創建 '子陣列' 你應該使用:

一個指向整數

selectionSort(int (*b)[], int size) 

並調用使用功能的數組:

selectionSort(&b[1], size-1); 
+2

如果b是int *或int []類型,那麼&b [1]是int *類型,而不是int **(int * []),不是嗎? – maverik

+2

'(int * b [])'會破壞邏輯(他正在傳遞一個整數數組,而不是一個整數指針數組),它現在可以正常工作。 – Nobilis

+0

是的,現在應該修復。 –

相關問題