2017-08-18 3 views
-1

prarr[3][3]へのポインタを含むptr_ptr_prarrの配列ptr_prarr[3][3]へのポインタを使用して配列prarr[3][3]を操作しようとしています。元の配列から元の配列へのポインタの配列を操作する

ptr_ptr_prarrptr_prarrを指し、のようなものを使用してprarr[i][j]のデータにアクセスします。

void main() 
{ 
int prarr[3][3]; 
int count = 1; 

for (int i = 0; i <= 2; i++) 
    for (int j = 0; j <= 2; j++) 
     prarr[i][j] = count++; 

//printArray(prarr); 

int *ptr_prarr[3][3]; 
for (int i = 0; i <= 2; i++) 
    for (int j = 0; j <= 2; j++) 
     ptr_prarr[i][j] = &prarr[i][j]; 

int n = 1, x = n, y = n; 
printf("\nArray Coords:(%d,%d)\nMemory location:%p\nValue:%d", 
     x, y, ptr_prarr[x][y], *ptr_prarr[x][y]); 

int **ptr_ptr_prarr= *ptr_prarr; 
printf("\n"); 
for (int i = 0; i <= 8; i+=3)/* <<--------------------------------- */ 
{ 
    for (int j = 0; j <= 2; j= (j+1)) 
     printf("%d", (ptr_ptr_prarr[i][j])); 
    printf("\n"); 
} 

Sleep(20000); 
} 

私は近い得ていると思いますが、何らかの理由でptr_ptr_prarrは「< < ------------------------を含む行が必要です--------- ":元のデータを複製するために異なる方法で反復する。

どういうわけか、私は何か間違ったところにアクセスしており、何か助けていただければ幸いです!

+0

ポインタは少し複雑ですが、ポインタを最悪にしています。なぜシンプルに行かないの? – haccks

+0

ヒント。 2次元配列に関する質問は、 'int prarr [2] [3]; 'のような異なるサイズを使用することでよく分かります。 – chux

+0

なぜこのポインタ配列を使うのか分かりません。ポインタを試すだけのことではない場合は、実際に達成したいことを記述してください。とにかく、競合プログラムに '[3] [3]より大きな配列が含まれていない' for(int i = 0; i <= 8; i + = 3) 'と' ptr_ptr_prarr [i] [j] ] '疑わしいです。 –

答えて

0

私は[0] [0]これはprarrのアドレスへのダブルポインタを作成します

int **ptr_ptr_prarr= *ptr_prarr; 

...問題はこのラインであると思います。私はあなたがやろうとしていると思うことはこれです...

int **ptr_ptr_prarr= ptr_prarr; 

これは、元の配列を取得するために間接参照することができptr_prarrポインタへのポインタを作成します。

は、このようにそれをやってあなたはptr_ptr_prarr使用prarrを変更したい場合、あなたはprarr [0] [0]今値10を含むように。これは、元の配列を変更するだろう

**ptr_ptr_prarr = 10 

ような何かを行うことができます。

**(ptr_ptr_prarr + 1) = 10 

これはprarrので、元の配列を変更することになる[0] [1]今値10

全体を含み、これはポインタの乏しい使用です。これは特に有用ではないようですが、ポインタを理解するのに役立つとは思えません。実際のプログラムでこのコードを使用しようとしている場合(単なる例ではありません)、別の方法でコードを実行することをお勧めします。

+0

ありがとうございます。私は数日前に何か他のことに取り組んでいるときにこの問題に遭遇しましたが、そのプロジェクトでは私は単にそれを行うための別の方法を見つけました。私はそれが私のポインタの理解をさらに深めることができると思ったので、今日の問題に戻りました。あなたが提供したソリューションは実際に私が試した最初のものの一つでしたが、私のコンパイラがエラーを吐き出したので動作しないと思っていました... "C4047: '初期化': 'int **'は、 'int *(*)[3]' ... ...私は自分の理解に欠陥があると思った。それはしかし、動作します。私はコンパイラを無視するべきだった。ありがとう! –

+0

コンパイラが正しいです。それは動作します(ちょうど何かがC言語で動作します)。あなたが何をしているのか正確に分からなければ、ちょっと変わった動作を引き起こすかもしれません。正に言えば、ptr_prarrはアドレスを保持する配列か、配列へのポインタ(必要に応じてインクリメントできる)のいずれかでなければなりません。ポインタで練習しようとしているので、2番目のオプションをお勧めします。そうすれば、実際にはダブルポインタを使った練習ができます。 – Alakazooom

0

配列は代入演算子の右辺で暗黙のポインタに崩壊するため、配列のアドレス演算子を使用する必要はありません。 だから、

int **ptr_ptr_prarr= ptr_prarr; 

Pointer to Array of Pointers

関連する問題