C言語の配列は基本的に(sizeof()
)のようないくつかの場所を除いてポインタのように振る舞います。そのポインタと配列変数を除いて、宣言以外では違いはありません。配列変数のアドレスと内容v C言語のポインタ
たとえば考える2つの宣言:
printf("%d %d", arrptr[0], arr[0]); //11 11
printf("%d %d", *arrptr, *arr); //11 11
しかし、ここで私が見つけたもう一つの場所は、彼らが異なっている:今ここに
int arr[] = {11,22,33};
int *arrptr = arr;
は、彼らが同じように動作する方法です
//the outputs will be different on your machine
printf("%d %d", &arrptr, &arr); //2686688 2686692 (obviously different address)
printf("%d %d", arrptr, arr); //2686692 2686692 (both same)
ここで最後の行に問題があります。 arrptr
にはarr
のアドレスが含まれています。最初のアドレスが最後の行に印刷されたのは2686692
なのはなぜですか?また、論理的には、とは異なり、arr
のアドレス()と内容(arr
)が同じである必要があります。しかし、それは正確に何が起こるのか(実装レベルでは内部的に)?
に
void *
にポインタ値をキャストする必要がある唯一の場所でありますポインタや配列については、それと同等のものとして考えるのをやめるのが最善です。それらは構文と使用法が似ている別のものです。理解するのが最も重要なことは、式で配列が使用されるたびに、配列が最初の要素へのポインタに「崩壊する」ということです。したがって、コードでは、最初の要素へのポインタと...最初の要素へのポインタを比較します。もちろん、彼らは同じなので、同じように動作します。 – Lundin