C の基礎を勉強していますが、文字列と配列について混乱しています。
#include<stdio.h>
int main()
{
char arr[2][4] = {1,2,3,4,5,6,7,8};
printf("%u %u\n",arr,arr+1);
printf("%d",*(*(arr+1)+2) );
return 0;
}
ここでarr
とarr+1
は隣接する場所ですが、2 番目printf
arr+1
は 2 番目の配列のゼロ インデックス要素に直行します。これはどのように合法ですか?2番目の配列に移動するには、&arr+1
.
私が学んだことは --> 一次元配列の場合:
arr[7]={1,2,3,4,5,6,7};
ここで arr と &arr は同じと見なされるべきではありません (ただし、同じ値が出力されますが、この情報の意味は完全に異なります)。そのため、 arr+1 と &arr+1 も同じではありません。&arr は、7 つの整数のコンテナーであるデータ型のアドレスを提供するため、 &arr+1 は、7 つの整数のコンテナーでもある後続の配列型に移動します。それで
arr = 5796 , &arr = 5796 (both are base address but arr is the address of
1st element while &arr is the address of the whole array)
arr+1 = 5800 ,&arr+1 = (5796+(7X4))=5797+28 = 5825(this is address of some
new array)
2 次元配列の場合、概念は同じです。
arr[2][4]={1,2,3,4,5,6,7,8};
今arr
ここにあるのは、配列の個々の要素を指すポインターでもある soarr
とarr+1
は、その連続する要素のアドレスです (そして、それらの要素は{1,2,3,4}
andです{5,6,7,8}
)_ and 同様に、2x4=8 要素を持つ 2 つの配列のベースアドレスを与えます&arr
。&arr+1
to&arr
と&arr+1
は、相似サイズの 2 つの配列のアドレスです。そう
arr = 5796 , arr+1 = 5796+(4*3)=5796+12 = 5808
&arr = 5796 , &arr+1 = 5796+(4*7)=5796+ 28= 5824
これで、2 次元配列で、個々の要素に到達するために 2 つのアドレスが関連付けられていることがわかります。
1)ar
r(配列内の2つの要素から選択する要素を与える)
2)*arr
(その特定の要素(配列)のどの要素を与えるか
そのため、データにアクセスしたい場合は、2 回逆参照する必要があります。
arr=5796(first array), *arr=5796(first element address), **arr = 1 (1st element)
arr+1=5812(second array), *(arr+1) = 5812(first element address), *(*(arr+1))=5(first element)
arr=5796,*arr=5796, *arr+1=5796+1(second element), *(*arr+1)=2 (second element)
配列の構文は次のとおりです。
*arr = arr[0]
**arr = arr[0][0]
*arr+1 = arr[0]+1
**arr+1 = arr[0][0]+1
*(*arr+1) = *(arr[0]+1) = arr[0][1]
*(*(arr+1)+1) = *(arr[1]+1) = arr[1][1]
配列を書き込む他の方法がいくつかあります
3[arr[1]] = arr[1][3]
-3[arr[1]] = -arr[1][3]
*(1[arr]+2) = *(arr[1]+2) = arr[1][2]
この概念は 3 次元配列にも拡張できますが、これはすべての初心者が理解する必要がある最低限のものです。概念的または構文的に間違っている場合は修正してください。