2011-05-10 84 views
1

我必須爲舊代碼添加新功能。舊的代碼有一個問題,有很多函數將數組作爲參數,像這樣的f(int x[][MAX_LENGTH])。所以我不想問是否可以(標準)通過int *[MAX_LENGTH]而不是?換句話說,代碼是以下標準?是否可以通過`int * [LENGTH]`而不是`int [] [LENGTH]`?

# include <iostream> 
using namespace std; 

void f(int x[][3]) 
{ 
    for(int i = 0; i < 2; ++i) 
    { 
     for(int j = 0; j < 3; ++j) 
      cout << x[i][j] << " "; 
     cout << endl; 
    } 
} 

int main() 
{ 
    typedef int v3 [3]; 
    v3 *x; 
    x = new v3 [2]; 
    for(int i = 0; i < 2; ++i) 
     for(int j = 0; j < 3; ++j) 
      x[i][j] = i * 3 + j; 

    f(x); 

    delete [] x; 
    return 0; 
} 

編輯請如果這個問題的答案是「YES」點標準文件的段落。

回答

1

您的問題與您的代碼不匹配,xmainint (*)[3],而不是int *[3]。在這種情況下,括號是重要的,因爲第一個是指向數組的指針,第二個是指針數組。

你的函數調用f(x)是有效的,因爲你的函數聲明等效於聲明爲數組轉換爲相應的指針類型

void f(int (*x)[3]) 

功能參數。 (ISO/IEC 14882:2003 8.3.5 [dcl.fct]/3)

xmain已鍵入v3*,這擴大了typedefint (*)[3]這正是由f所需的類型。

2

編譯器重寫f(int x[][MAX_LENGTH])f(int (*x)[MAX_LENGTH]),與f(int *x[MAX_LENGTH])不同。前者是指向數組的指針,後者是指針數組。

+0

但是,在這個例子中,'x'的類型確實是'int(*)[3]'。所以這個例子是正確的 - 它甚至不需要在函數參數「x」上進行轉換。 – aschepler 2011-05-10 12:42:37

+0

@asch:Mihran特意詢問他是否可以將參數重寫爲int * [MAX_LENGTH]'。我的答案是否定的,因爲這會改變語義。 – fredoverflow 2011-05-10 12:45:59

相關問題