0

こんにちは、私はポインターと配列の理論的なことを理解しようとしています。ポインターと配列の概念について私が持っていた疑念を誰かが再確認してくれることを期待していました。

私はこのようなものを持っていたとします

int ia[] = {0,1,2,3,4,5};
ia[2];  // =2

int* ip = &ia[0]; // pointer ip gets the address of element 0 in array ia
ip[2]; // ??
ip[2] = 42; // 

このコードのほとんどは明らかに理論的なものですが、最後の 2 行については少しわかりません。最初に ip[2] と言うのは、ip が配列の 2 番目の要素を指すようになったと言うのと同じですか? *ip = ia[2] と言うのと同じですか?

私も最後の行と混同しています。IP[2] = 42; IPが指すオブジェクトの2番目の要素、そのアドレスは値42を取得しますか? それとも逆参照の配列表記法ですか?何が起こっているのか少し混乱しています。

4

4 に答える 4

2

ia[n]は別の書き方*(ia+n)であるためint* ip = &ia[0]、と同じint *ip = iaです。

に割り当てiaていipます。もちろん、これはip[n] == ia[n]のすべての値にも当てはまりますn

于 2013-03-21T06:05:35.150 に答える
1

あなたが書くとき、それはaがベースアドレス(基本的にはポインタ)であるところにa[i]翻訳されます*(a+i)

配列の場合も、ベースアドレスは最初の要素のアドレスと同じであるため、のアドレスは[ie ]a[0]と同じです。aa = &a[0]

したがって、次のようにip[2] = 42;変換され*(ip+2) = 42 ます。また、*はそのアドレスでの値を示します。つまり、場所での値をip[2] = 42意味します。*(ip+2) = 42(ip+2)

于 2013-03-21T06:04:11.270 に答える
1

次の例では、ia という配列を作成し、数値を中括弧で囲んで配列に格納します。

int ia[] = {0,1,2,3,4,5};

実際には、次のことは何もしません。

ia[2];

ただし、上記のステートメントを次のように変更すると、値 2 が整数 t に割り当てられます。これは、2 が ia の 3 番目の要素であり、ia[2] が ia の 3 番目の要素を参照しているためです。

t = ia[2];

ia の元の宣言が

int ia[] = {0,1,15,3,4,5};

次に、t を 15 に割り当てます。

以下は、ia のインデックス 2 の値を 42 に変更します。

ip[2] = 42;

現在、ia は {0,1,42,3,4,5} で構成されています。

これは、ia[2] が *(ia + 2) と言っているようなものだからです。ip を ia に割り当てると、ip は ia の最初の要素を指します。

同様に、ip[2] は *(ip + 2) と言っているようなものです。したがって、ip[2] を変更すると ia[2] が変更され、同じメモリ チャンクが参照されます。

于 2013-03-21T06:06:57.470 に答える
1

a[b]とまったく同じ*(a + b)です。いつも。Soia[2]は と同等*(ia + 2)であり、ip[2]は と同等*(ip + 2)です。

ただし、 と には非常に異なるタイプがあるためia、それよりも微妙です。配列型です。一方、ポインタ型です。したがって、それらは「同じ」ではありません。同じ種類のものでもありません。リンゴとオレンジのようです。ipiaip

特定のコンテキスト内で使用される配列式は、最初の要素へのポインターに暗黙的に変換できます。と書いた場合int *ip = ia;、それはそのような暗黙の変換になります。ipこれで、 の最初の要素を指しiaます。書いてあることと全く同じで、int *ip = &ia[0];

のようなものを書くと*(ia + 2)、このコンテキストでも、配列は最初の要素へのポインターに暗黙的に変換されます*(&ia[0] + 2)ipが の最初の要素を指していることがわかっているので、ポインタに変換される任意のコンテキストでiaを使用iaすると、 の値を使用するのと同じになりますip。それが理由ia[2]でありip[2]、同じように機能します。

于 2013-03-21T09:20:14.777 に答える