配列とポインタの関係
配列とポインタの関係
このチュートリアルでは、C プログラミングにおける配列とポインターの関係について学習します。また、ポインターを使用して配列要素にアクセスする方法も学習します。
配列とポインターの関係について学習する前に、次の 2 つのトピックを確認してください。
- C配列
- C ポインタ
配列とポインタの関係
配列は、順次データのブロックです。配列要素のアドレスを出力するプログラムを書きましょう。
#include <stdio.h>
int main() {
int x[4];
int i;
for(i = 0; i < 4; ++i) {
printf("&x[%d] = %p\n", i, &x[i]);
}
printf("Address of array x: %p", x);
return 0;
}
出力
&x[0] = 1450734448 &x[1] = 1450734452 &x[2] = 1450734456 &x[3] = 1450734460 Address of array x: 1450734448
配列 x の 2 つの連続する要素の間には 4 バイトの違いがあります . int
のサイズだからです は 4 バイトです (コンパイラ上)。
&x[0] のアドレスが と x 同じです。変数名 x が 配列の最初の要素を指します。
<図>
上記の例から、&x[0]
であることは明らかです。 x と同等です .そして、x[0]
*x
と同等です .
同様に、
&x[1]
x+1
と同等です そしてx[1]
*(x+1)
と同等です .&x[2]
x+2
と同等です およびx[2]
*(x+2)
と同等です .- ...
- 基本的に、
&x[i]
x+i
と同等です とx[i]
*(x+i)
と同等です .
例 1:ポインターと配列
#include <stdio.h>
int main() {
int i, x[6], sum = 0;
printf("Enter 6 numbers: ");
for(i = 0; i < 6; ++i) {
// Equivalent to scanf("%d", &x[i]);
scanf("%d", x+i);
// Equivalent to sum += x[i]
sum += *(x+i);
}
printf("Sum = %d", sum);
return 0;
}
プログラムを実行すると、出力は次のようになります:
Enter 6 numbers: 2 3 4 4 12 4 Sum = 29
ここで、配列 x を宣言しました 6 要素の。配列の要素にアクセスするために、ポインターを使用しました。
ほとんどのコンテキストでは、配列名はポインターに分解されます。簡単に言えば、配列名はポインターに変換されます。これが、ポインターを使用して配列の要素にアクセスできる理由です。ただし、ポインタと配列は同じではないことに注意してください。 .
配列名がポインターに変化しない場合がいくつかあります。詳細については、次を参照してください:配列名がポインターに分解されないのはいつですか?
例 2:配列とポインタ
#include <stdio.h>
int main() {
int x[5] = {1, 2, 3, 4, 5};
int* ptr;
// ptr is assigned the address of the third element
ptr = &x[2];
printf("*ptr = %d \n", *ptr); // 3
printf("*(ptr+1) = %d \n", *(ptr+1)); // 4
printf("*(ptr-1) = %d", *(ptr-1)); // 2
return 0;
}
プログラムを実行すると、出力は次のようになります:
*ptr = 3 *(ptr+1) = 4 *(ptr-1) = 2
この例では、&x[2]
、3 番目の要素のアドレスが ptr に割り当てられます ポインター。したがって、3
*ptr
を印刷したときに表示されました .
そして、 *(ptr+1)
を印刷します 4 番目の要素が得られます。同様に、 *(ptr-1)
を印刷します 2 番目の要素が得られます。
C言語