記事のディレクトリ
配列ポインタとポインタ配列
ポインタ配列
int *arr1[10];
int **arr3[5];
これは本質的に配列ですが、ポインターは配列に格納されます。
配列ポインタ
int(*arr4)[10];
基本的にポインタ、配列を指すことができるポインタ。コード上で直接使用する方法。
void print_arr1(int arr[3][5], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
void print_arr2(int (*arr)[5], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
print_arr1(arr, 3, 5);
print_arr2(arr, 3, 5);
return 0;
}
print_arr1とprint_arr2は、配列ポインタを使用する2つの方法です。
コードの意味を分析する
int main()
{
//数组
int arr[5];
//指针数组
int *parr1[10];
//数组指针
int(*parr2)[10];
//指针数组的数组 数组中存放10个指针,这10个指针指向10个数组,这10个数组每个数组的大小是5
int(*parr3[10])[5];
return 0;
}
&アレイ名VSアレイ名
直接コーディングする
int main()
{
int arr[10] = { 0 };
printf("%p\n", arr);
printf("%p\n", &arr);
return 0;
}
コードを実行した結果から、違いを見つけるのは難しいように見えますが、実際には2つの式の意味が異なり、次のコードで確認できます。
int main()
{
int arr[10] = { 0 };
printf("%p\n", arr);
printf("%p\n", &arr);
printf("%p\n", arr + 1);
printf("%p\n", &arr + 1);
return 0;
}
実行結果を観察したところ、両方に1を加算すると、結果が異なることがわかりました。配列名は、配列の最初の要素のアドレスを取得します。1つを追加すると、データ型のサイズが追加され、結果は&array nameによって取得されます。配列のアドレスに1を追加する場合は、配列のサイズを追加します。配列には合計10個の要素があるため、各要素は4バイトであるため、40バイトが追加されます。