2013-01-12 82 views
10

我的問題是基座上的以下代碼:的C指針表示法相比數組符號:當傳遞到功能

int myfunct(int ary[], int arysize) 
int myfunct2(int *ary, int arysize) 

int main(void){ 
    int numary[10]; 
    myfunct(numary, 10) 
    myfunct2(numary, 10) 
    return; 
} 

int myfunct(int ary[], int arysize) { 
     //Whatever work is done 

    } 

int myfunct2(int *ary, int arysize) { 
    // Whatever work is done 

    } 

是否有一個原因使用這些中的一個比其他?詳細說明一下,當關心數值數組時,是否有任何理由希望在數組表示法上使用指針表示法。如果使用指針表示法,那麼在函數指針內將使用等號。如果使用[]數組表示法,可以像往常一樣使用數組。我是編程新手,目前看不到使用指針表示法的好處。

我的確切問題是,是否有任何理由使用指針表示法將數值數組傳遞給函數,因此在函數中使用指針操作。

回答

8

這兩種符號之間沒有真正的功能差異。在C中,當你將一個數組變量傳遞給一個函數時,它會衰減到一個指針,而不管這個符號如何。但是,在我看來,指針符號更可取。在函數定義[]符號的問題是,在我看來,這是有點誤導:

void foo(int array[]) 
{ 

} 

初學C程序員中無處不在的錯誤是假設sizeof(array)會給你數中的元素的數組乘以sizeof(int),就像array是在堆棧中聲明的數組變量一樣。但現實情況是,array已經衰減到一個指針,儘管誤導[]表示法,所以sizeof(array)將是sizeof(int*)array實際上只是指向第一個元素的指針,或者可能是指向任何地方分配的單個整數的指針。

例如,我們可以稱之爲foo這樣的:

int x = 10; 
foo(&x); 

在這種情況下,[]符號在foo的定義是一種誤導。

+0

所以如果我使用* ary反對ary [],我可以在函數內使用ary [0]嗎? – SystemFun

+0

@弗拉德,是............, –

+0

@弗拉德我以爲你明白我的答案?無論上下文如何,'ary [0]'是'*(ary + 0)'都是'* ary'。如果你可以使用一個,你可以使用另一個(在表達式中,也就是)。 – melpomene

10

當您將函數參數聲明爲數組時,編譯器會自動忽略數組大小(如果有)並將其轉換爲指針。也就是說,這個聲明:

int foo(char p[123]); 

相當於100%:

int foo(char *p); 

事實上,這是不是格式,但對實際類型:

typedef char array_t[42]; 
int foo(array_t p); // still the same function 

這有與您如何在功能內訪問p無關。此外,[]運算符不是「數組符號」。 []是指針操作符:

a[b] 

相當於100%:

*(a + b) 
+0

我明白這一點。我的問題是指在該職能範圍內進行的操縱。 – SystemFun

+1

@Vlad如果你的問題是關於函數的內部,爲什麼你的例子代碼除了那個之外的其他所有代碼呢? – melpomene

-1

你只需要使用數組表示法爲多維數組。 (您不必提供第一個維度的大小)。

1

這些聲明完全相同。引用標準:

的參數爲「類型的陣列」的聲明,應調整至 「合格指針輸入」

C99標準節6.7.5.3第7段

0

在C99以來具有可變長度數組的現代C中,如果是數組,我認爲數組表示法是可取的。對於一個維數組,你可以做這樣的事情

int myfunct(size_t size, int array[size]) { 
    ... array[i] .. 
} 

和二維

int myfunct(size_t size, int array[size][size]) { 
    ... array[i][j] .. 
} 

所以數組符號適合在一般的畫面要好得多。一個複雜的編譯器甚至可以進行邊界檢查,但是我還不知道這一點。

+0

請注意,在一維情況下,'int array [size]'與'int * array'具有相同的效果,即'array'仍然是一個指針,'size'是多餘的,除了作爲文檔。在2-D情況下,'array'的類型是'int(*)[size]'。 –