たとえば、私はこの宣言を持っています:
int a[10];
以前、私はそれを次のように理解していa
ました。実際にはポインタであり、メモリ内の10個の要素を連続して指します。
しかし、今日、私の先生が私に教えてくれたとき、彼は言った:それはポインターの配列であり、各ポインターはその値を指している。
どちらが正しいかわかりません。教えてください。
以前、私は次のように理解しています。実際にはaはポインタであり、メモリ内の10個の要素を連続して指します。
これは間違っています、それは配列です。メモリ内の特定の場所にあり、10個の整数を保持できます。ポインタを使用すると実行できますがa = &some_int
、これは配列では機能しません。ポインターを期待している関数に渡すa
と、ポインターは減衰(変換)されますが、これは異なります。
しかし、今日、私の先生が私をからかったとき、彼は言いました:それはポインターの配列を持ち、各ポインターはその値を指します。
これも間違っています。10個の整数の配列です。10個の整数ポインターを使用するには、それをとして定義する必要がありますint *a[10]
。それでも要素はそれらの値を指していません。
あなたとあなたの先生は両方とも間違っています。
a
int
ポインタとしての関数に渡して標準のポインタ演算を実行できるという点で、へのポインタのいくつかの機能がありますが、それでもC用語では配列です。たとえば、変更することはできません(のように扱いますint * const
)。
ただし、の要素は、a
ランダムな場所へのポインタではなく、連続した配列としてメモリに配置されます。
私はあなたがあなたの先生を誤解したに違いない。
aは実際にはポインタであり、メモリ内の10個の要素を連続して指します。
これはほとんど問題ありません。(場合によっては、このように考えることができます。しかし、それは非常に単純化されすぎており、他の人はその理由を説明しています。)
ポインタの配列になります
これは完全に間違っています。
そして、各ポインタはその値を指します。
これは完全に間違っています。
単純な用語では、「「a」は10個の要素を連続してメモリに保持する変数です」。そのため、これを配列と呼びます。変数の要素にアクセスするには、インデックスが必要です。つまり、変数'a'の5番目の要素にアクセスするには、a[5]を指定する必要があります。'a'を指定すると、連続するメモリ位置の開始アドレスを指し、a + 5を指定すると、最初の連続するメモリから始まる5番目の要素を指します。
配列とポインタに関するすばらしいFAQは、http: //c-faq.com/aryptr/index.htmlで参照できます。
int a[10];
メモリに割り当てられた整数の10個のセルを指します。
int *b = a;
はと同等でint *b = &a[0];
あり、正確にはbがaの最初のセルを指していることを意味します。