配列ポインタとポインタ配列について話す

配列ポインタとポインタ配列

ポインタ配列

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バイトが追加されます。

おすすめ

転載: blog.csdn.net/weixin_43580319/article/details/111823415