2012-02-28 141 views
0

如果我在函數以下代碼:訪問元素

int A[5][5]; 
    int i; int j; 
    for(i=0;i<5;i++){ 
    for(j=0;j<5;j++){ 
     A[i][j]=i+j; 
     printf("%d\n", A[i][j]); 
    } 
    } 

這僅僅打印出各指標的總和。我想知道的是,是否有可能以類似於動態數組的方式訪問靜態數組中的每個索引。因此,舉例來說,如果我想訪問A [2] [2],可我說:

*(A+(2*5+2)*sizeof(int))? 

我想在靜態分配矩陣進行一些矩陣運算,我覺得用來解引用動態矩陣的方法將最適合我的目的。有任何想法嗎?謝謝。

+1

該數組並非像您聲明的那樣是靜態的。 – 2012-02-28 20:44:46

+0

如果解除引用的指針是指向int的指針,則sizeof()的乘法是不必要的。指針指向的指針類型大小的指針算術步驟。 – dmckee 2012-02-28 20:48:35

+1

@dmckee不僅沒有必要,而且是錯誤的。首先,它不會做他期望的事情,其次,你可以越過數組的邊界並進入未定義的行爲。 – 2012-02-28 20:50:30

回答

4

就是這麼做的:A[i][j]

它打印出索引的總和,因爲您將元素A[i][j]設置爲索引之和:A[i][j] = i+j

+0

我認爲OP正在詢問如何使用指針算法來訪問一個元素。關於數據分配方式的問題更多的是關於訪問數據的「正確」方式。 – 2012-02-28 21:09:22

+0

@AdamLiss可能會,或者他感到困惑,他得到了索引的總和。 – 2012-02-28 21:11:34

+1

@LuchianGrigore:我讀過這樣一句話,「這只是打印出每個索引的總和」,與你閱讀它的方式有些不同。你讀它爲:「問題是,這應該打印出數組元素,而是打印出索引的總和。」我讀它爲:「這只是簡單的代碼來展示我的意思;它打印出數組元素,它們被設置爲它們索引的總和。」 – ruakh 2012-02-28 22:18:06

1

您可以使用:

*(*(A + 2) + 2) 

A[2][2]。指針運算是以不在char單位的指針類型爲單位完成的。

當然,首選的方法是在您的程序中使用A[2][2]

+0

只是'A [2] [2]'有什麼問題? – 2012-02-28 20:47:31

+0

@LuchianGrigore我認爲OP用顯式指針算術問'A [2] [2]'的等價性。 – ouah 2012-02-28 20:49:30

+0

@LuchianGrigore'A [2] [2]'它沒有錯。但他正在尋求一種使用其指針值訪問「A」元素的方法。 – 2012-02-28 20:49:49

0

下標操作a[i]被定義爲*(a + i) - 你計算i元件(不是字節)的從a一個偏移量,然後解除引用的結果。對於二維數組,你只要申請該定義遞歸:

a[i][j] == *(a[i] + j) == *(*(a + i) + j) 

如果數組連續分配的,你也可以只寫*(a + i * rows + j)

在進行指針運算時,會考慮基本類型的大小。給定一個指針

T *p; 

表達p + 1將評估爲T類型的下一個對象,該對象是psizeof T字節的地址。

請注意,使用指針運算可能不會比使用下標運算符更快(編碼兩個版本並通過分析器運行它們以確保)。它會肯定可讀性較差。

0

指針算術可能會很棘手。 您正處於正確的軌道上,但是指針和正常算術之間存在一些差異。 例如考慮這個代碼

int I = 0; 
float F = 0; 
double D = 0; 
int* PI = 0; 
float* PF = 0; 
double* PD = 0; 

cout<<I<<" "<<F<<" "<<D<<" "<<PI<<" "<<PF<<" "<<PD<<endl; 
I++;F++;D++;PI++;PF++,PD++; 

cout<<I<<" "<<F<<" "<<D<<" "<<PI<<" "<<PF<<" "<<PD<<endl; 
cout<<I<<" "<<F<<" "<<D<<" "<<(int)PI<<" "<<(int)PF<<" "<<(int)PD<<endl; 

如果你運行它看你會看到會看起來像這樣的輸出(取決於您的架構和編譯)

0 0 0 0 0 0 
1 1 1 0x4 0x4 0x8 
1 1 1 4 4 8 

正如你可以看到指針運算根據它指向的變量的類型處理

因此請記住使用指針算術時您訪問的是哪種類型的變量。

只是爲了舉例起見考慮下面的代碼太:

void* V = 0; 

int* IV = (int*)V; 
float* FV = (float*)V; 
double* DV = (double*)V; 

IV++;FV++;DV++; 
cout<<IV<<" "<<FV<<" "<<DV<<endl; 

你會得到輸出(同樣取決於你的架構和編譯)

0x4 0x4 0x8 

記住上面的代碼片段僅用於演示目的。有很多東西不從這裏使用