2012-02-28 4 views
0

Iは、関数で次のコードがある場合:アクセス要素

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]); 
    } 
    } 

これは単に各インデックスの和を出力します。私が知りたいのは、静的配列の各インデックスに、動的配列と同様の方法でアクセスできるかどうかです。したがって、たとえば、私がアクセスしたい場合は、[2] [2]、私が言うことができます。

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

私は静的に割り当てられた行列にいくつかの行列演算を実行したいと私は間接参照ダイナミック行列に使用される方法のように感じます私の目的のために一番うまくいくでしょう。何か案は?ありがとうございました。

+1

あなたが主張しているように、その配列は静的ではありません。 –

+0

逆参照されるポインタがintへのポインタの場合、sizeof()による乗算は不要です。ポインタの指し示すタイプのサイズによる算術ステップ。 – dmckee

+1

@dmckeeだけでなく、それは間違っている必要はありません。まず、彼はそれが期待していることをしません、次に、あなたは配列の境界を越えて、未定義の動作に入ることができます。 –

答えて

4

それはそれを行う方法です:A[i][j]

これは、インデックスA[i][j] = i+jの合計に要素A[i][j]を設定しているため、インデックスの合計を出力します。

+0

私は、ポインタ演算を使って要素にアクセスする方法をOPが尋ねていると思います。それは、データへのアクセスの「適切な」方法よりも、データの割り当て方法に関する質問です。 –

+0

@AdamLissは、おそらく彼がインデックスの合計を取得していると混乱している可能性があります。 –

+1

@ LuchianGrigore:「これは単純に各インデックスの合計を出力します」という文章を読む方法とは少し異なります。 "問題は配列要素を出力することになっていますが、代わりにインデックスの合計を出力します。"私はこれを読んで、「これは私が何を意味するかを示す単純なコードであり、インデックスの合計に設定されている配列要素を出力します。 – ruakh

1

あなたは使用することができます:A[2][2]ため

*(*(A + 2) + 2) 

を。ポインタ演算は、charの単位ではなく、尖ったタイプの単位で行われます。

もちろん、プログラムでA[2][2]を使用することをお勧めします。

+0

ちょうど 'A [2] [2]'の何が問題なのですか? –

+0

@LuchianGrigore私は、OPが明示的なポインタ算術で 'A [2] [2]'の等価性を尋ねたと仮定しました。 – ouah

+0

@LuchianGrigore 'A [2] [2]'は間違っていません。しかし、彼はポインタ値を使って 'A'の要素にアクセスする方法を尋ねています。 –

0

添字操作a[i]*(a + i)のように定義される - あなたはaからi要素(ないバイト)のオフセットとその結果間接参照計算します。 2次元配列の場合は、あなただけ再帰的にその定義を適用する:配列が連続して割り当てられている場合

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

、あなたはまた、単に*(a + i * rows + j)を書くことができます。

ポインタの算術演算を行うとき、基本型のサイズが考慮されます。ポインタ

T *p; 

与えられた式p + 1psizeof Tバイトである、タイプ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 

(あなたのアーキテクチャとコンパイラに依存します)を指す変数のタイプに応じて、が処理されます。

ポインタ演算を使用する場合は、どのタイプの変数にアクセスしているのか注意してください。あなたは出力(もう一度アーキテクチャとコンパイラに依存する)

0x4 0x4 0x8 

は、上記のコードスニペットがあることを覚えておいてください取得します

void* V = 0; 

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

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

:あまりにも、このコードを考えてみ単なる例のために

デモンストレーションの目的のためだけです。多くのものがありますここからを使用しないでください。