0

私は配列exを持っています:

int array[3][5];

その配列の要素に値を割り当てたい場合は、簡単です...例:

array[1][2] = 8;

しかし、ポインタ演算で表現したいのですが、これは正しいでしょうか?

**(array + 5 * 1 + 2) = 8;

どちらの場合も、7 番目の位置を探しています... (code) の外側に 2 番目の * を含める必要があるかどうかはわかりません

**(code)

編集:フォローアップのほんの少し。これを手伝ってくれたすべての人に感謝します。私が混乱したのは、インストラクターのメモの間違いによるものでした。あなたが提供した情報を私が提示した後、彼は間違いに気づき、次のことに同意しました。

*(*(array+row)+col) 

また

*(*array+MAX_COL*row+col) 

は、2 次元配列の正確なポインター演算表現です。

これ**(array+MAX_COL*row+col)は、 James Kanzeがこの投稿への返信の 1 つで言及したarray[MAX_COL*row+col]ように、多次元配列の 1 次元配列実装で使用される のようなものです (2 番目のものは最初のものよりも高速です)。

4

6 に答える 6

5

最初に知っておく必要があるのは、2次元配列はポインターへのポインターではないということです。Tそれらはメモリ内で隣接しているため、 (T基本型である)へのポインタで表すことができます。

int arr[3][5];
int *p = &arr[0][0];

int array_1_2 = *(p + 5 * 1 + 2);
于 2013-03-15T08:53:58.973 に答える
4

array[1][2]に等しい*( *(array + 1) + 2)

于 2013-03-15T08:56:40.803 に答える
3

配列へのアクセスと同義のポインター算術演算を示す例。

#include<stdio.h>

int main()
{
int array[3][5] = {0};
array[2][3] = 5;
printf( "%d\n",array[2][3]);
printf( "%d\n",*(*(array+2)+3) );
return 0;
} 
于 2013-03-15T09:06:08.390 に答える
2

別の表現は次のようになります。

*(array[1]+5)=8

簡単な類似コードを説明しましょう。

int *p[5];

pこれは、最初の要素のアドレスを指すポインターであり、とp同等&p[0]です。

これを理解するために、例を挙げてみましょう

#include<iostream.h>    
void main()
{    
int *p[2];
int a=0,b=1;
p[0]=&a;p[1]=&b;
cout<<*p<<endl<<&a<<endl;
cout<<*(p+1)<<endl<<&b<<endl;
cout<<p<<endl<<p+1<<endl;
cout<<**p<<endl<<**(p+1);    
}

上記のコードの出力は次のとおりです。

0x8fbdfff0
0x8fbdfff0
0x8fbdffee
0x8fbdffee
0x8fbdfff2
0x8fbdfff4
0
1

この場合、int array[3][5]は と同等int *p1[5] int *p2[5] int *p3[5]です。ここでp1、 、p2、は、p3それぞれ最初の 2 行目と 3 行目の最初の要素を指すポインターを表します。

array[3]したがって、実質的にはポインターと見なすことができ、同様に array[2] および 3とarray[1]同等です。したがって、 or ( (array+1)+2)を使用して値を取得するか、行優先形式で実装されていると考えると、そしてあなたは得るp1array[1][2]*(array[1]+2)*(array+1)array+1*5
*(array+1*5+2)

于 2013-03-15T11:35:55.993 に答える
2

あなたの質問にはいくつかの間違った仮定があります。たとえば、array[1][2]7 番目の位置を見ていません。の 2 番目の配列要素の 3 番目の位置を見てい arrayます。の型arrayは array[3] of array[5] ofintです。ポインターに変換すると、結果の型は へのポインターではなく、 の array[5] へintポインターになりintます。したがってarray + 5 * 1 + 2)、要素が 5 つしかない配列の 8 番目の要素を指します。つまり、 35 * sizeof(int) の先頭を超えていarray ます (そして、式はまだ array[5] of への型ポインタを持っていますint)。

原則として、多次元配列へのアクセスをシミュレートする場合は、1 次元配列を宣言する必要があります。

int array[columns * rows];

これを行うと、*(array + i * columns + j)効果的に 2 次元のインデックス作成が実行されます。

于 2013-03-15T09:30:36.003 に答える
1

次の配列を使用します。

const int ROWS = 3;
const int COLS = 5;
int arr[ROWS][COLS];

最初の要素が存在するメモリを指しますがarr、そのタイプはint*このポインタをインクリメントしないため、2番目の要素に移動しませんint。したがって、この行:

arr[1][2] = 8;

次のように置き換えることができます:

*((int*)arr + 1*COLS + 2) = 8;

または、この配列がメモリの連続ブロック内に存在し、そのサイズがに等しいという事実を使用できますROWS * COLS * sizeof(int)。したがって、最初の要素へのポインタを取得して、この目的に使用できます。

int* pFirstEle = &arr[0][0];
*(pFirstEle + 1*COLS + 2) = 8;

ただし、これは間違っていることに注意してください。

**(arr + 1*COLS + 2) = 8;
于 2013-03-15T09:05:54.697 に答える