ポインターと配列
ポインタを使用してアクセスすることもできます配列.
次の整数の配列を考えてみましょう。
例
int myNumbers[4] = {25, 50, 75, 100};
あなたはから学びました配列の章を使用して配列要素をループできることfor
ループ:
例
int myNumbers[4] = {25, 50, 75, 100};
int i;
for (i = 0; i < 4; i++) {
printf("%d\n", myNumbers[i]);
}
結果:
255075100
自分で試してみる »
各配列要素の値を出力する代わりに、各配列要素のメモリ アドレスを出力しましょう。
例
int myNumbers[4] = {25, 50, 75, 100};
int i;
for (i = 0; i < 4; i++) {
printf("%p\n", &myNumbers[i]);
}
結果:
0x7ffe70f9d8f00x7ffe70f9d8f40x7ffe70f9d8f80x7ffe70f9d8fc
自分で試してみる »
各要素のメモリ アドレスの最後の番号が異なり、4 が追加されていることに注意してください。
のサイズだからです。int
type は通常 4 バイトです。次のことを覚えておいてください。
例
// Create an int variable
int myInt;
// Get the memory size of an int
printf("%lu", sizeof(myInt));
結果:
4
自分で試してみる »
したがって、上記の「メモリ アドレスの例」から、コンパイラが配列要素ごとに 4 バイトのメモリを予約していることがわかります。これは、配列全体が 16 バイト (4 * 4) のメモリ ストレージを占有することを意味します。
例
int myNumbers[4] = {25, 50, 75, 100};
// Get the size of the myNumbers array
printf("%lu", sizeof(myNumbers));
結果:
16
自分で試してみる »
ポインターは配列にどのように関連していますか
では、ポインタと配列の関係は何ですか?さて、Cでは、配列の名前、実際にはポインターに最初の要素アレイの。
混乱している?これをよりよく理解し、上記の「メモリ アドレスの例」をもう一度使用してみましょう。
のメモリアドレスの最初の要素と同じです配列の名前:
例
int myNumbers[4] = {25, 50, 75, 100};
// Get the memory address of the myNumbers array
printf("%p\n", myNumbers);
// Get the memory address of the first array element
printf("%p\n", &myNumbers[0]);
結果:
0x7ffe70f9d8f00x7ffe70f9d8f0
自分で試してみる »
これは基本的に、ポインターを介して配列を操作できることを意味します!
どうやって? myNumbers は myNumbers の最初の要素へのポインターであるため、*
それにアクセスする演算子:
例
int myNumbers[4] = {25, 50, 75, 100};
// Get the value of the first element in myNumbers
printf("%d", *myNumbers);
結果:
25
自分で試してみる »
myNumbers の残りの要素にアクセスするには、ポインター/配列をインクリメントします (+1、+2 など)。
例
int myNumbers[4] = {25, 50, 75, 100};
// Get the value of the second element in myNumbers
printf("%d\n", *(myNumbers + 1));
// Get the value of the third element in myNumbers
printf("%d", *(myNumbers + 2));
// and so on..
結果:
5075
自分で試してみる »
またはそれをループします:
例
int myNumbers[4] = {25, 50, 75, 100};
int *ptr = myNumbers;
int i;
for (i = 0; i < 4; i++) {
printf("%d\n", *(ptr + i));
}
結果:
255075100
自分で試してみる »
ポインターを使用して配列要素の値を変更することもできます。
例
int myNumbers[4] = {25, 50, 75, 100};
// Change the value of the first element to 13
*myNumbers = 13;
// Change the value of the second element to 17
*(myNumbers +1) = 17;
// Get the value of the first element
printf("%d\n", *myNumbers);
// Get the value of the second element
printf("%d\n", *(myNumbers + 1));
結果:
1317
自分で試してみる »
配列を操作するこの方法は、少し過剰に思えるかもしれません。特に上記の例のような単純な配列では。ただし、大きな配列の場合は、ポインターを使用して配列にアクセスして操作する方がはるかに効率的です。
また、アクセスが高速で簡単であると考えられています二次元配列ポインタ付き。
また、文字列は実際には配列であるため、ポインターを使用してアクセスすることもできます文字列.
今のところ、これがどのように機能するかを知っていることは素晴らしいことです。ただし、前の章で指定したように。ポインタは慎重に扱う必要があります、メモリに保存されている他のデータを上書きする可能性があるためです。