2012-01-05 216 views
0

在我的C應用程序,我有以下聲明:C指針函數

typedef double mat[MAX_SIZE][MAX_SIZE]; 

我也有一個全局變量:

mat aaa; 

在功能我要做到以下幾點:

void func2(mat ccc) 
{ 
    ccc = aaa; 
} 

void func1() 
{ 
    mat bbb; 
    func2(bbb); 
    bbb[1][2] = 3; 
} 

我希望func2()之後的操作可以在bbb上影響全局變量aaa,但他們沒有。

有關爲什麼行爲不符合我的期望的任何建議?

+1

將數組傳遞給函數作爲參數並不是一個好習慣。它們被作爲指針傳遞和長度(一個或多個)丟失 - 這讓你通過長度(一個或多個),也爲自變量(一個或多個)。 – Rolice 2012-01-05 19:21:35

回答

1

您需要製作bbb指針併發送bbb的地址。

void func1() 
{ 
    mat *bbb; 
    func2(&bbb); 
    (*bbb)[1][2] = 3; 
} 

和編輯func2像這樣:

void func2(mat **ccc){ 
    *ccc=&aaa; 
} 
+2

嗯,作爲問題代表好像他想要的線'BBB [1] [2] = 3;'以某種方式影響'aaa'。因此,'bbb'必須有一個指針類型。另外,你的函數'func1'不會像你期望的那樣工作。 – 2012-01-05 19:16:37

+0

* ccc = aaa;這是行不通的。數組不能通過這樣的賦值來複制。 – 2012-01-05 19:16:52

+0

謝謝。我只注意到了這一點。編輯。 – 2012-01-05 19:22:44

0

你的類型mat是不是一個指針類型,它是一個數組。您不能分配給數組變量下的常用方法來解決你的問題是使用指針:

void func1(void) 
{ 
    mat *bbb = &aaa; 
    (*bbb)[1][2] = 3; 
} 
0

你的意思是,bbb[1][2] = 3;將在aaa做些什麼呢?那麼你將不得不這樣做:

mat aaa; 

mat* func2() { 
    return &aaa; 
} 
void func1() { 
    mat* bbb = func2(); 
    (*bbb)[1][2] = 3; 
} 
+0

我編輯爲使用正確的全局變量名稱。希望你不介意。 – 2012-01-05 19:19:09

0

這個代碼有一個概念錯誤 - 數組表達式可能不是一個賦值的目標。如果試圖寫

void func1(void) 
{ 
    mat bbb; 
    bbb = aaa; 
    bbb[1][2] = 3; 
} 

編譯器將拋出的診斷上的表達bbb = aaa(GCC「中分配不兼容的類型」診斷給出,因爲aaa被轉換爲指針類型;低於更多)。通過傳遞bbbfunc2你試圖做的事情實際上是同樣的事情,並且最終不會起作用。

讓我們擺脫了類型定義的,所以我們可以看到實際的類型涉及

double aaa[MAX_SIZE][MAX_SIZE]; 
... 
void func2(double (*ccc)[MAX_SIZE]) 
{ 
    ccc = aaa; 
} 

void func1() 
{ 
    double bbb[MAX_SIZE][MAX_SIZE]; 
    func2(bbb); 
    bbb[1][2] = 3; 
} 

除非是sizeof或一元&運營商的操作數,或者是一個字符串用來初始化另一個陣列一個聲明,類型爲「T的N元素數組」的表達式將被替換爲「指向T」類型的表達式,其值是該數組的第一個元素的地址。當你調用func2,表達bbb從類型「MAX_SIZE陣列MAX_SIZE陣列的double的」轉換爲「指針MAX_SIZE陣列的double」;因此ccc的聲明爲double (*ccc)[MAX_SIZE]

類似地,在func2ccc = aaa,表達aaadouble [MAX_SIZE][MAX_SIZE]類型轉換爲double (*)[MAX_SIZE]

到目前爲止,func2是猶太教,因爲ccc是一個指針表達式,而不是一個數組表達式,所以賦值是允許的。 ccc也恰好是從bbb(其接收到的指針值的副本bbb計算結果爲)一個完全不同的實體,所以寫入cccbbb沒有影響。如果試圖通過傳遞指針來解決,要bbb,像這樣:

void func2(double (*ccc)[MAX_SIZE][MAX_SIZE]) 
{ 
    *ccc = aaa; 
} 

void func1(void) 
{ 
    double bbb[MAX_SIZE][MAX_SIZE]; 
    func2(&bbb); 
    bbb[1][2] = 3; 
} 

編譯器會把這個診斷上*ccc = aaa,或者是因爲*ccc有數組類型,或者是因爲類型的*cccaaa不兼容(請記住,aaa轉換爲指針表達式)。